- Если вы хотите использовать
base R
, вам может помочь следующее решение.
Предполагая, что вы вводите
response <- c(1, 1, 2, 1, 2, 3, 1, 2, 3, 5, 1, 2, 4, 1, 2, 4, 5, 6, 1, 2, 4, 6, 1, 2, 4, 7)
, тогда
status <- c("Crop failure", "Water shortage", "Lang degradation", "Lack of HH Labor", "Lack of income from agriculture", "Lack of manure / fertilizer", "Others")
df <- as.data.frame(table(factor(response,labels = status),dnn = list("Status")))
может дать вам вывод, такой как
> df
Status Freq
1 Crop failure 8
2 Water shortage 7
3 Lang degradation 2
4 Lack of HH Labor 4
5 Lack of income from agriculture 2
6 Lack of manure / fertilizer 2
7 Others 1
- Если вы хотите иметь подробную таблицу: Предполагая, что вы вводите:
r <- list(1, c(1, 2), c(1, 2, 3), c(1, 2, 3, 5), c(1, 2, 4), c(1,
2, 4, 5, 6), c(1, 2, 4), 6, c(1, 2, 4, 7))
type = seq(1,7)
dt <- as.data.frame(t(sapply(r, function(v) sapply(type, function(k) sum(k==v)))))
colnames(M) <- paste0("type",type)
, что дает
> dt
type1 type2 type3 type4 type5 type6 type7
1 1 0 0 0 0 0 0
2 1 1 0 0 0 0 0
3 1 1 1 0 0 0 0
4 1 1 1 0 1 0 0
5 1 1 0 1 0 0 0
6 1 1 0 1 1 1 0
7 1 1 0 1 0 0 0
8 0 0 0 0 0 1 0
9 1 1 0 1 0 0 1
Кроме того, сумма записей каждого типа может быть рассчитана как colSums
:
> colSums(dt)
type1 type2 type3 type4 type5 type6 type7
8 7 2 4 2 2 1
Или вы можете использовать match()
, то есть
dt <- as.data.frame(t(sapply(r, function(v) !is.na(match(type,v)))))
> dt
type1 type2 type3 type4 type5 type6 type7
1 TRUE FALSE FALSE FALSE FALSE FALSE FALSE
2 TRUE TRUE FALSE FALSE FALSE FALSE FALSE
3 TRUE TRUE TRUE FALSE FALSE FALSE FALSE
4 TRUE TRUE TRUE FALSE TRUE FALSE FALSE
5 TRUE TRUE FALSE TRUE FALSE FALSE FALSE
6 TRUE TRUE FALSE TRUE TRUE TRUE FALSE
7 TRUE TRUE FALSE TRUE FALSE FALSE FALSE
8 FALSE FALSE FALSE FALSE FALSE TRUE FALSE
9 TRUE TRUE FALSE TRUE FALSE FALSE TRUE