我有来自目前结构类似
的主题的数据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频率类别。有什么更好的方法呢?
答案 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];
}
};