R语言:按Subject与Event分组,基于时序生成ref1列的需求
R语言DataFrame分组判断元素出现顺序并生成新列
我有如下简化后的DataFrame:
example <- data.frame( Subject = c(101, 101, 101, 101, 102, 102, 102, 102), event = c('A', 'B', 'B', 'A', 'A', 'B', 'B', 'A'), trialtype = c("immneg", "rneg", "immneg", "rneg", "rneg", "immneg", "rneg", "immneg"), timing = c(1,2,3,4,5,6,7,8))
需要创建名为ref1的新列,规则如下:
- 按
Subject和event分组 - 依据
timing列判断每组中trialtype里immneg与rneg的出现顺序- 若
rneg先出现(即rneg的最小timing小于immneg的最小timing),ref1取值为1 - 若
immneg先出现,ref1取值为0
- 若
期望得到的结果如下:
solution <- data.frame( Subject = c(101, 101, 101, 101, 102, 102, 102, 102), event = c('A', 'B', 'B', 'A', 'A', 'B', 'B', 'A'), trialtype = c("immneg", "rneg", "immneg", "rneg", "rneg", "immneg", "rneg", "immneg"), timing = c(1,2,3,4,5,6,7,8), ref1 = c(0,1,1,0,1,0,0,1))
解决方案
可以使用dplyr包完成分组计算,步骤清晰且高效:
library(dplyr) result <- example %>% group_by(Subject, event) %>% mutate( # 计算每组中rneg和immneg的最早出现时间 min_rneg = min(timing[trialtype == "rneg"]), min_immneg = min(timing[trialtype == "immneg"]), # 比较时间大小,生成ref1列 ref1 = as.integer(min_rneg < min_immneg) ) %>% ungroup() %>% select(-min_rneg, -min_immneg) # 移除临时计算列
运行后result的结构和取值与给定的solution完全一致。
内容的提问来源于stack exchange,提问作者jo_
相关产品推荐
相关产品推荐

