Функция table()
может создавать таблицы сопряженности любого количества уровней. Вы можете передать весь свой фрейм данных, затем сгладить и изменить его форму (при условии, что я правильно понял).
library(tidyr)
table(df) %>%
as.data.frame() %>%
pivot_wider(names_from = age, values_from = Freq)
# A tibble: 36 x 11
dead work sex `19` `20` `26` `44` `51` `56` `71` `77`
<fct> <fct> <fct> <int> <int> <int> <int> <int> <int> <int> <int>
1 0 01 F 0 0 0 0 0 0 0 0
2 1 01 F 0 0 0 0 0 0 0 0
3 0 13 F 0 0 0 0 1 0 0 0
4 1 13 F 0 0 0 0 0 0 0 0
5 0 20 F 0 1 0 0 0 0 0 0
6 1 20 F 0 0 0 0 0 0 0 0
7 0 44 F 0 0 0 0 0 0 0 0
8 1 44 F 0 0 0 0 0 0 0 0
9 0 62 F 0 0 0 0 0 0 1 0
10 1 62 F 0 0 0 0 0 0 0 0
# ... with 26 more rows
Оттуда вы можете дополнительно разделить, изменить или отфильтровать, если необходимо.
Данные:
df <- structure(list(age = c(56L, 20L, 71L, 26L, 44L, 19L, 77L, 51L,
56L), dead = c(1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L), work = structure(c(4L,
3L, 5L, 8L, 7L, 1L, 6L, 2L, 9L), .Label = c("01", "13", "20",
"44", "62", "78", "80", "A0", "Z0"), class = "factor"), sex = structure(c(2L,
1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L), .Label = c("F", "M"), class = "factor")), class = "data.frame", row.names = c(NA,
-9L))