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

R多条件列赋值:按subject分组新增列,取CS+对应Per_size值

R data.table 实现方案

你可以直接使用data.table内置的nafill函数完成需求,代码简洁且执行效率高,适合处理大样本数据集:

# 加载data.table包(如果未加载)
library(data.table)

# 你的示例数据集
dt <- structure(list(subject = c("subject1", "subject1", "subject1", 
"subject1", "subject1", "subject1", "subject1", "subject1", "subject1", 
"subject2", "subject2", "subject2", "subject2", "subject2", "subject2", 
"subject2", "subject2", "subject2"), stimulus = c("CS-", "CS-", 
"CS+", "CS-", "S8", "S7", "S2", "CS+", "CS+", "CS-", "CS-", "CS+", 
"S4", "S9", "S7", "CS+", "CS+", "S8"), Per_size = c(60L, 70L, 
30L, 85L, 62L, 56L, 42L, 36L, 34L, 24L, 21L, 70L, 65L, 31L, 35L, 
79L, 79L, 34L)), row.names = c(NA, -18L), class = c("data.table", 
"data.frame"))

# 新增列逻辑
dt[, new_col := nafill(nafill(fifelse(stimulus == "CS+", Per_size, NA), type = "nocb"), type = "locf"), by = subject]

逻辑说明

  • 按subject分组独立计算,符合分组要求
  • fifelse(stimulus == "CS+", Per_size, NA):仅保留CS+对应的Per_size值,其余行设为缺失值
  • 内层nafill(..., type = "nocb"):后向填充,将首次CS+出现前的所有缺失值替换为该分组第一个CS+的Per_size,满足规则2
  • 外层nafill(..., type = "locf"):前向填充,将两次CS+之间的缺失值替换为最近一次出现的CS+的Per_size,仅当新CS+出现时更新取值,满足规则1

运行结果示例

subjectstimulusPer_sizenew_col
subject1CS-6030
subject1CS-7030
subject1CS+3030
subject1CS-8530
subject1S86230
subject1S75630
subject1S24230
subject1CS+3636
subject1CS+3434
subject2CS-2470
subject2CS-2170
subject2CS+7070
subject2S46570
subject2S93170
subject2S73570
subject2CS+7979
subject2CS+7979
subject2S83479

内容的提问来源于stack exchange,提问作者Kenny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 16:57:05