在R语言中按ID分组为Indicator变量对应赋值value2的实现
R语言实现按组替换value2的解决方案
原始数据
| id | time | value1 | indicator | value2 |
|---|---|---|---|---|
| 1 | 2004 | 1 | 1 | 1 |
| 1 | 2005 | 0 | 0 | 1 |
| 1 | 2006 | -1 | 0 | 1 |
| 1 | 2007 | -3 | 0 | 1 |
| 1 | 2008 | 3 | 0 | 1 |
| 2 | 2004 | 1 | 0 | NA |
| 2 | 2005 | 3 | 0 | NA |
| 2 | 2006 | 0 | 0 | NA |
| 2 | 2007 | 0 | 0 | NA |
| 3 | 2004 | -1 | 1 | -1 |
| 3 | 2005 | -3 | 0 | -1 |
| 3 | 2006 | 4 | 0 | -1 |
| 3 | 2007 | 5 | 0 | -1 |
| 4 | 2004 | 4 | 0 | -4 |
| 4 | 2005 | 5 | 0 | -4 |
| 4 | 2006 | 2 | 0 | -4 |
| 4 | 2007 | -4 | 1 | -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)
代码说明
- 分组:通过
group_by(id)按id分组处理 - 提取参考值:用
first(value2[indicator == 1])获取每组中indicator=1的value2值(若组内有多个indicator=1的行,可根据需求替换为unique()或其他统计量) - 替换逻辑:
- 若组内无indicator=1的行(
ref_value为NA),所有行的value2设为NA - 若有参考值,indicator=0的行替换为参考值,indicator=1的行保留原值
- 若组内无indicator=1的行(
- 清理:移除临时辅助列并取消分组
内容的提问来源于stack exchange,提问作者J L
相关产品推荐
相关产品推荐

