生成数据框多列频数表:保留未出现的5分制评分选项
问题描述
我有一份问卷数据,受访者需对多个问题进行5分制评分,数据框构造代码如下:
Q5_1 <- c("completely agree", "agree a little", "completely agree", "completely agree") Q5_2 <- c("agree a little", "do not agree or disagree", "agree a little", "completely agree") Q5_3 <- c("do not agree or disagree","do not agree or disagree","do not agree or disagree","do not agree or disagree") df <- data.frame(Q5_1, Q5_2, Q5_3)
我需要生成包含两列(Q5_1、Q5_3)的频数表,要求纳入所有5分制评分选项(包括从未被选择的选项),理想输出格式如下:
Q5_1 Q5_3 completely disagree 0 0 disagree a little 0 0 do not agree or disagree 0 4 agree a little 2 0 completely agree 2 0
但我尝试用table(df$Q5_1, df$Q5_3)得到的是交叉表,且只显示了出现过的选项,不符合需求:
do not agree or disagree agree a little 2 completely agree 2
我能手动构造类似理想格式的数据框,但统计测试需要标准的频数表格式。
解决方案
核心问题是原始的评分变量是字符型,table()函数只会统计实际出现过的取值。只需将变量转换为指定完整水平的因子,就能让所有5分制选项都被纳入统计:
- 定义完整的5分制评分选项:
full_responses <- c("completely disagree", "disagree a little", "do not agree or disagree", "agree a little", "completely agree")
- 将Q5_1和Q5_3转换为因子,指定levels为完整选项:
df$Q5_1 <- factor(df$Q5_1, levels = full_responses) df$Q5_3 <- factor(df$Q5_3, levels = full_responses)
- 分别统计两个变量的频数并合并为目标格式:
# 统计各变量频数 freq_Q51 <- table(df$Q5_1) freq_Q53 <- table(df$Q5_3) # 合并为两列的频数表 result_table <- cbind(Q5_1 = as.numeric(freq_Q51), Q5_3 = as.numeric(freq_Q53)) # 设置行名为完整评分选项 rownames(result_table) <- full_responses
运行后result_table就是符合要求的频数表,输出如下:
Q5_1 Q5_3 completely disagree 0 0 disagree a little 0 0 do not agree or disagree 0 4 agree a little 2 0 completely agree 2 0
这个结果是标准的矩阵格式(属于R的频数表类型),可以直接用于后续统计测试。
内容的提问来源于stack exchange,提问作者Lieke
相关产品推荐
相关产品推荐

