将数据从列的宽计数转换为频率计数

Converting data from wide to frequency counts of columns

我有来自当前结构如下的主题的数据

df <- data.frame(subject.ID = 1:6, 
      questionA = as.factor(c("SA", "A", "D", "SD", "A", "N")), 
      questionB = as.factor(c("A", "A", "D", "SD", "A", "N")), 
      questionC = as.factor(c("SA", "A", "A", "SD", "A", "SD")))

将其转换为每行都包含问题和 5 个响应选项的频率的数据框的最优雅方法是什么?即

> 
    Question     SA        A       N       D        SD
1   questionA     1        2       1       1        1
2   questionB     0        3       1       1        1
3   questionC     1        3       0       0        2

我试过处理数据的一小部分(只是问题 A)并在转置它和重新标记列之前使用 plyr 的计数函数(即:

temp2 <- count(df, c("questionA"))
questionName <- "questionA"
responseNames <- temp2$questionA
temp2 <- as.data.frame(t(temp2[,-1]))
colnames(temp2) <- responseNames
temp2$question <- questionName

它在大多数情况下确实有效,但并不理想(一次一个问题,这意味着将所有问题重新绑定在一起并且非常笨拙)并且它不包括 0 频率类别。这样做的更好方法是什么?

一个data.table解决方案:

library(data.table)
setDT(df)
dcast(melt(df, id.vars = 'subject.ID'), variable ~ value)
#     variable A D N SA SD
# 1: questionA 2 1 1  1  1
# 2: questionB 3 1 1  0  1
# 3: questionC 3 0 0  1  2

我们可以使用 reshape2 中的 recast,它是 melt/dcast

的便捷包装器
library(reshape2)
recast(df, id.var = "subject.ID", variable ~ value)
#   variable A D N SA SD
#1 questionA 2 1 1  1  1
#2 questionB 3 1 1  0  1
#3 questionC 3 0 0  1  2