已完成数据重编码,如何用dplyr统计各列Agree与Disagree的数量?
解决dplyr统计每列Agree/Disagree次数的问题
嘿,我来帮你搞定这个统计需求!你已经完成了数据重编码的关键步骤,接下来统计每列的Agree和Disagree次数其实很容易,咱们分两种常用的方式来实现:
方法一:用dplyr最新的across函数(推荐)
dplyr从1.0.0版本开始推荐用across替代_all系列函数,写法更清晰灵活。这里我们可以对每列直接计算目标值的出现次数,再整理成易读的格式:
library(dplyr) library(tidyr) # 生成宽格式统计结果:每列对应Agree和Disagree的计数 agree_disagree_counts <- new %>% # 只统计需要的列,比如排除Qx1_mod1的话可以用 starts_with("Q") 替换 everything() summarise(across(everything(), ~ tibble( Agree = sum(. == "Agree", na.rm = TRUE), Disagree = sum(. == "Disagree", na.rm = TRUE) ))) %>% unnest_wider(everything()) # 如果想要更直观的长格式(适合后续分析/可视化) agree_disagree_long <- new %>% pivot_longer(cols = everything(), names_to = "问题列名", values_to = "响应") %>% filter(响应 %in% c("Agree", "Disagree")) %>% count(问题列名, 响应) %>% pivot_wider(names_from = 响应, values_from = n, values_fill = 0)
方法二:兼容旧版本dplyr的summarise_all写法
如果你还在使用旧版dplyr(1.0.0之前),可以用summarise_all来实现,逻辑和上面一致:
# 旧版本dplyr的实现方式 agree_disagree_counts_old <- new %>% summarise_all(~ list( Agree = sum(. == "Agree", na.rm = TRUE), Disagree = sum(. == "Disagree", na.rm = TRUE) )) %>% unnest_wider(everything())
为什么之前的summarise_all没成功?
大概率是你直接用了count或者table这类函数,它们返回的是表格对象,summarise_all没法直接将其整理成整洁的数值结果。而用sum(. == "目标值")的方式会直接返回单个计数,更容易被dplyr处理成规范的输出。
另外提醒下:如果你的new数据框里包含不需要统计的列(比如Qx1_mod1),可以把across(everything())改成across(starts_with("Q"))或者其他列选择器,只统计问题相关的列哦~
内容的提问来源于stack exchange,提问作者333
相关产品推荐
相关产品推荐

