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

时间:2018-03-01 18:45:42

标签: r plyr

我有来自目前结构类似

的主题的数据
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频率类别。有什么更好的方法呢?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

我们可以使用recast中的reshape2 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 的便捷包装

this.dataSource.sortingDataAccessor =(item, property) => {
    switch (property) {
    case 'project.name': return item.project.name;

    default: return item[property];
    }
  };