将数据从列的宽计数转换为频率计数
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
我有来自当前结构如下的主题的数据
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