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

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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 01:07:40