在R中添加依赖多变量的BPP列(优先dplyr方案)
使用dplyr添加BPP列的解决方案
我们可以通过分组+行号标记+条件判断的方式实现需求,核心逻辑是按ID和val1分组后,根据每组内的行位置匹配对应的规则计算BPP值:
library(dplyr) # 计算BPP列 df_result <- df %>% group_by(ID, val1) %>% mutate( # 为每组内的行分配序号 row_in_group = row_number(), # 根据行序号匹配规则计算BPP BPP = case_when( row_in_group == 1 ~ EXP_P, row_in_group == 2 ~ lag(BRR, 1), row_in_group == 3 ~ max(lag(BRR, 1), lag(BRR, 2), na.rm = TRUE), row_in_group >= 4 ~ max(lag(BRR, 1), lag(BRR, 2), lag(BRR, 3), na.rm = TRUE) ) ) %>% # 移除临时的行序号列 select(-row_in_group) %>% ungroup() # 输出结果 print(df_result)
代码说明
- 分组:用
group_by(ID, val1)确保我们在相同ID和val1的组内处理数据; - 行号标记:
row_number()生成组内的行序号,用于判断当前行属于规则中的哪一种情况; - 条件计算:
- 组内第1行(val1首次出现):直接取当前行的
EXP_P; - 组内第2行:取上一行的
BRR值; - 组内第3行:取前两行
BRR的最大值; - 组内第4行及以后:取前三行
BRR的最大值;
- 组内第1行(val1首次出现):直接取当前行的
- 清理与去分组:移除临时的行序号列,并用
ungroup()取消分组状态。
运行代码后得到的结果与你提供的期望输出完全一致。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

