R语言如何按参与者ID分组统计问卷作答为Yes的总次数
问题描述
我有一个数据集,包含数百名参与者和对照组对26个问题的作答数据。每个参与者对应26道题的作答记录,答案选项对应值为:Yes(1)、No(-1)、Maybe(0)、未作答(NA)。
我需要按每个参与者统计所有26道题中作答为Yes(1)的总次数,将结果存入新列,统计时忽略No(-1)的作答值,比如某参与者12次选Yes,新列对应值即为12。
我已经尝试过for循环、if else语句、子集选取、group by和sum等方法,但还是不知道如何遍历26道题的同时仅统计当前参与者的作答,排除其他参与者的数据。
示例数据结构
ID PatientResponse ControlResponse QuestionNumber 1 122047 1 0 1 2 123274 -1 -1 1 3 186223 1 1 1 4 122047 0 -1 2 5 123274 1 -1 2 6 186223 -1 0 2
解决方案
以下提供两种常用的实现方式,都可以直接满足按参与者单独统计Yes次数的需求:
1. tidyverse(dplyr)实现
代码简洁易读,分组后自动按条件过滤统计,内置支持跳过未作答的NA值:
# 加载依赖包 library(dplyr) # 按参与者ID分组统计Yes总次数 stat_result <- df %>% group_by(ID) %>% summarise(yes_total = sum(PatientResponse == 1, na.rm = TRUE)) # 如需将统计结果合并回原数据集,执行左连接即可 df <- df %>% left_join(stat_result, by = "ID")
基于你提供的示例数据,得到的统计结果如下:
| ID | yes_total |
|---|---|
| 122047 | 1 |
| 123274 | 1 |
| 186223 | 1 |
2. 基础R实现
无需额外安装依赖包,用R内置函数即可完成统计:
# 按ID分组统计Yes次数 stat_result <- aggregate(PatientResponse ~ ID, data = df, FUN = function(x) { sum(x == 1, na.rm = TRUE) }) # 将统计结果合并到原数据集 df$yes_total <- stat_result$yes_total[match(df$ID, stat_result$ID)]
如果需要同时统计对照组的Yes作答次数,只需把上述代码中的PatientResponse替换为ControlResponse即可。
内容的提问来源于stack exchange,提问作者ozymandias
相关产品推荐
相关产品推荐

