我有一个数据框,其中包含每个问题1列的调查结果。只有5种不同的满意度(VDSAT,DSAT,NTL,SAT,VSAT),所以每列都是一堆满意度。
我想有一个摘要data.frame,对于每一列,我计算了多少不同的满意度(如果没有发生,则设为0)。每列都是一个问题,每一行都是满意度,交叉点是计数。
我尝试使用apply(df,2,table)
,它会给我一个表格列表,然后使用data.frame(matrix(unlist(table),nrow=5))
放入data.frame格式。
如果每列的每个满意度水平至少有1个结果,这种方法效果很好。如果一列(例如,没有“DSAT”),则生成的data.frame不正确,因为来自apply的table命令无法识别缺失值。
基本上输出如下:
Q1 Q2 Q3 Q4 Q5 Satisfaction
12 16 22 24 23 Very dissatisfied
27 30 33 24 33 Dissatisfied
49 36 33 30 32 Neutral
6 11 17 25 22 Satisfied
22 23 11 13 6 Very satisfied
非常感谢
亲切的问候,
编辑: 原始数据样本:
Q1 Q2 Q3 Q4 Q5
Very satisfied Very satisfied Very satisfied Very satisfied Very satisfied
Satisfied Dissatisfied Very dissatisfied Dissatisfied Satisfied
Very satisfied Very satisfied Very satisfied Very satisfied Very satisfied
Satisfied Satisfied Satisfied Satisfied Satisfied
Very satisfied Very satisfied Very satisfied Very satisfied Very satisfied
... ... ... ... ...
答案 0 :(得分:2)
以下是使用dplyr
和tidyr
的方法。我们的想法是将您的数据从宽格式转换为长格式,计算每个答案和问题的出现次数,并将数据传播回大范围。
library(tidyr)
library(dplyr)
gather(dat, Question, Answer) %>%
count(Question, Answer) %>%
spread(Question, n, fill = 0L)
#Source: local data frame [5 x 6]
#
# Answer Q1 Q2 Q3 Q4 Q5
#1 DSAT 1 0 1 3 0
#2 NTL 0 0 0 1 2
#3 SAT 0 1 0 0 1
#4 VDSAT 1 3 2 0 1
#5 VSAT 2 0 1 0 0
我使用的示例数据:
set.seed(12)
dat <- as.data.frame(matrix(sample(c("VDSAT","DSAT","NTL","SAT","VSAT"), 20, TRUE), ncol = 5))
dat[] <- lapply(dat, factor, levels = c("VDSAT","DSAT","NTL","SAT","VSAT"))
names(dat) <- paste0("Q", 1:5)