Я хотел бы получить таблицу, в которой подсчитываются частоты каждой категории факторов по всем переменным, кроме id. У меня есть несколько переменных, каждая из которых может содержать 1, 0 или NA, и мне нужна таблица, которая дает мне частоту каждой из них. Ниже я изменил NA на 2, поскольку NA не включен как категория в факторные переменные, а затем я создаю каждую из переменных, кроме id-факторов. Я не могу понять последний шаг, чтобы получить таблицу «хочу» ниже, в которой для каждой переменной просто подсчитывается количество единиц, количество нулей и количество NA.
# have
df3=data.frame(id=c(1,2,3,4,5,6,7),
ibd=c(0,1,1,0,0,1,1),
ihd=c(1,1,0,NA,0,0,1),
psoriasis=c(0,0,NA,0,0,1,1),
mi=c(1,0,0,0,0,NA,1)
)
df3 %>% replace(is.na(.), 2)
df3 <- df3 %>%
mutate(across(-c(id), as.factor))
# want
df5=data.frame(id=c("1s", "0s", "NAs"),
ibd=c(4,3,0),
ihd=c(3,3,1),
psoriasis=c(2,4,1),
mi=c(2,4,1)
)





library(tidyr); library(dplyr)
pivot_longer(df3, -id) |>
group_by(name) |>
count(value) |>
pivot_wider(names_from=name, values_from=n, values_fill=0)
# A tibble: 3 × 5
value ibd ihd mi psoriasis
<fct> <int> <int> <int> <int>
1 0 3 3 4 4
2 1 4 3 2 2
3 NA 0 1 1 1
Вы можете использовать table + stack, как показано ниже.
table(
stack(
type.convert(df3[-1], as.is = TRUE)
),
useNA = "ifany"
)
который дает
ind
values ibd ihd psoriasis mi
0 3 3 4 4
1 4 3 2 2
<NA> 0 1 1 1
Filter(is.factor, df3) |>
lapply(\(x) table(factor(x, levels = c(1, 0)), useNA = "always")) |>
do.call(cbind, args = _) |>
as_tibble(rownames = "id")
# id ibd ihd psoriasis mi
# <chr> <int> <int> <int> <int>
# 1 1 4 3 2 2
# 2 0 3 3 4 4
# 3 NA 0 1 1 1
Где
df3 <- data.frame(
id = seq(1, 7, by = 1),
ibd = factor(c("0", "1", "1", "0", "0", "1", "1")),
ihd = factor(c("1", "1", "0", NA, "0", "0", "1")),
psoriasis = factor(c("0", "0", NA, "0", "0", "1", "1")),
mi = factor(c("1", "0", "0", "0", "0", NA, "1"))
)
library(purrr)
library(dplyr)
select(df3, -id) |>
imap(\(x, y) as.data.frame(table(x, useNA = "always", dnn = "id"), responseName = y)) |>
reduce(full_join, by = "id")
# id ibd ihd psoriasis mi
# 1 0 3 3 4 4
# 2 1 4 3 2 2
# 3 <NA> 0 1 1 1
group_by(name) |> count(value)равноcount(name, value)