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

在R语言中按ID分组为Indicator变量对应赋值value2的实现

R语言实现按组替换value2的解决方案

原始数据

idtimevalue1indicatorvalue2
12004111
12005001
12006-101
12007-301
12008301
2200410NA
2200530NA
2200600NA
2200700NA
32004-11-1
32005-30-1
3200640-1
3200750-1
4200440-4
4200550-4
4200620-4
42007-41-4

需求说明

按id分组处理:

  • 若行的indicator为0,将该行value2替换为同组内indicator为1的行对应的value2值
  • 若某id分组内无indicator为1的行,该组所有行的value2赋值为NA

实现代码

使用dplyr包完成分组替换逻辑,代码如下:

# 加载dplyr包
library(dplyr)

# 构造原始数据框(如果已有数据可跳过此步骤)
df <- tibble(
  id = c(1,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4),
  time = c(2004,2005,2006,2007,2008,2004,2005,2006,2007,2004,2005,2006,2007,2004,2005,2006,2007),
  value1 = c(1,0,-1,-3,3,1,3,0,0,-1,-3,4,5,4,5,2,-4),
  indicator = c(1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1),
  value2 = c(1,1,1,1,1,NA,NA,NA,NA,-1,-1,-1,-1,-4,-4,-4,-4)
)

# 执行分组替换
df_processed <- df %>%
  group_by(id) %>%
  mutate(
    # 提取当前组indicator=1对应的value2值,无匹配则为NA
    ref_value = first(value2[indicator == 1]),
    # 按规则更新value2:无参考值则全为NA,否则替换indicator=0的行
    value2 = ifelse(is.na(ref_value), NA, ifelse(indicator == 0, ref_value, value2))
  ) %>%
  select(-ref_value) %>%  # 删除临时辅助列
  ungroup()

# 查看处理后的数据
print(df_processed)

代码说明

  1. 分组:通过group_by(id)按id分组处理
  2. 提取参考值:用first(value2[indicator == 1])获取每组中indicator=1的value2值(若组内有多个indicator=1的行,可根据需求替换为unique()或其他统计量)
  3. 替换逻辑:
    • 若组内无indicator=1的行(ref_value为NA),所有行的value2设为NA
    • 若有参考值,indicator=0的行替换为参考值,indicator=1的行保留原值
  4. 清理:移除临时辅助列并取消分组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:30:58