You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已完成数据重编码,如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:40:27