如何用R统计各参与者各试验的PASS题目数量并生成表格
嗨,作为Stack Overflow新手+R入门用户,这个需求其实很容易实现,我给你两种实用的方法,一种是用tidyverse的工具(逻辑清晰,新手友好),另一种是基础R函数(不用额外装包):
首先,先把你的示例数据构造出来方便测试:
# 构造示例数据框 df <- data.frame( Participant = rep(c("P01", "P02", "P03"), each = 6), Trial = rep(rep(c("T01", "T02", "T03"), each = 2), 3), Question = rep(c("Q01", "Q02"), 9), Outcome = c("PASS", "PASS", "FAIL", "FAIL", "FAIL", "PASS", "FAIL", "PASS", "PASS", "PASS", "FAIL", "PASS", "FAIL", "FAIL", "PASS", "PASS", "PASS", "FAIL") )
方法1:用tidyverse工具链(dplyr + tidyr)
这个方法逻辑直观,一步步拆解需求:
- 先筛选出所有
Outcome为PASS的记录 - 按
Participant和Trial分组,统计每组的PASS数量 - 把长格式的数据转换成你需要的宽格式,缺失的组合自动填充0
代码如下:
# 如果没装过tidyverse,先运行 install.packages("tidyverse") library(dplyr) library(tidyr) result <- df %>% filter(Outcome == "PASS") %>% # 只保留通过的题目记录 count(Participant, Trial) %>% # 按参与者+试验分组统计PASS数量 pivot_wider( names_from = Trial, # 把Trial的取值作为列名 values_from = n, # 把统计的数量作为单元格值 values_fill = 0 # 没有PASS的组合填充0,避免出现NA ) print(result)
运行后就能得到你想要的表格:
Participant T01 T02 T03 1 P01 2 0 1 2 P02 1 2 1 3 P03 0 2 1
方法2:基础R的xtabs函数
如果你不想安装额外的包,可以用基础R自带的xtabs函数,它可以直接基于条件生成交叉统计表格:
# 直接统计每个(参与者,试验)组合的PASS数量 result_base <- xtabs(~ Participant + Trial, data = df, subset = Outcome == "PASS") # 转换成数据框格式更符合你的输出需求 result_base <- as.data.frame.matrix(result_base) print(result_base)
这个方法的核心是subset参数,它只让xtabs统计Outcome == "PASS"的行,所以直接得到了PASS题目的计数,转成data.frame.matrix后就是你要的样式。
补充说明:为什么table函数不行?
你提到的table(df$Participant, df$Trial)只是统计每个(参与者,试验)组合的总记录数(每个试验下有2道题,所以结果都是2),而我们需要的是其中Outcome为PASS的数量,所以必须先过滤条件,或者在统计时指定筛选逻辑,上面的两种方法都解决了这个问题。
内容的提问来源于stack exchange,提问作者Miguel
相关产品推荐
相关产品推荐

