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

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")

基于你提供的示例数据,得到的统计结果如下:

IDyes_total
1220471
1232741
1862231

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:54:02