R语言按参与者分组查询Count=4对应试次号 缺失返回0的实现问题
解决方案
现有代码丢失无Count=4记录的参与者,核心原因是aggregate使用公式语法时默认会删除所有待聚合列全为NA的分组,你要的调整逻辑可以按如下方式实现:
方案1:调整原有base R代码逻辑
第一步:保留你原有过滤Count>4的逻辑
df <- df[with(df, !(Count> 4)),]
第二步:新增分组标记,判断每个参与者是否存在Count=4的记录
# ave函数实现按Participant分组计算 df$has_count4 <- ave(df$Count, df$Participant, FUN = function(x) any(x == 4))
第三步:按要求生成Performance列
三个分支判断逻辑:Count=4时取对应TrialNumber;无Count=4记录的参与者第一条试次记0;其余情况记NA
df$Performance <- ifelse(df$Count == 4, df$TrialNumber, ifelse(!df$has_count4 & df$TrialNumber == 1, 0, NA))
第四步:聚合时添加na.action参数避免丢失分组
df_Performance <- aggregate(Performance ~ Participant, data = df, FUN = function(x) na.omit(x)[1], na.action = na.pass)
运行后输出结果为:
| Participant | Performance |
|---|---|
| 118 | 4 |
| 120 | 0 |
| 121 | 4 |
方案2:更简洁的dplyr实现
如果可以使用tidyverse生态的包,代码会更易读,不需要新增中间列:
library(dplyr) df_Performance <- df %>% group_by(Participant) %>% summarise(Performance = ifelse(any(Count == 4), first(TrialNumber[Count == 4]), 0)) %>% ungroup()
内容的提问来源于stack exchange,提问作者r.rodrigues18
相关产品推荐
相关产品推荐

