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
运行结果示例
| subject | stimulus | Per_size | new_col |
|---|---|---|---|
| subject1 | CS- | 60 | 30 |
| subject1 | CS- | 70 | 30 |
| subject1 | CS+ | 30 | 30 |
| subject1 | CS- | 85 | 30 |
| subject1 | S8 | 62 | 30 |
| subject1 | S7 | 56 | 30 |
| subject1 | S2 | 42 | 30 |
| subject1 | CS+ | 36 | 36 |
| subject1 | CS+ | 34 | 34 |
| subject2 | CS- | 24 | 70 |
| subject2 | CS- | 21 | 70 |
| subject2 | CS+ | 70 | 70 |
| subject2 | S4 | 65 | 70 |
| subject2 | S9 | 31 | 70 |
| subject2 | S7 | 35 | 70 |
| subject2 | CS+ | 79 | 79 |
| subject2 | CS+ | 79 | 79 |
| subject2 | S8 | 34 | 79 |
内容的提问来源于stack exchange,提问作者Kenny
相关产品推荐
相关产品推荐

