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

在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)

代码说明

  1. 分组:用group_by(ID, val1)确保我们在相同ID和val1的组内处理数据;
  2. 行号标记:row_number()生成组内的行序号,用于判断当前行属于规则中的哪一种情况;
  3. 条件计算:
    • 组内第1行(val1首次出现):直接取当前行的EXP_P;
    • 组内第2行:取上一行的BRR值;
    • 组内第3行:取前两行BRR的最大值;
    • 组内第4行及以后:取前三行BRR的最大值;
  4. 清理与去分组:移除临时的行序号列,并用ungroup()取消分组状态。

运行代码后得到的结果与你提供的期望输出完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:35:21