如何在R语言中根据另一列的重复值修改数据列值
R数据分组批量更新解决方案
原始数据
data <- data.frame(grupoaih = c("09081997", "13122006", "09081997", "22031969"), NMM_PROC_BR = c(1, 1, 0, 1), NMM_CID = c(0, 1, 1, 0), CPAV_PROC_BR = c(0, 0, 0, 1), CPAV_CID = c(1, 1, 0, 1)) # 输出预览 # grupoaih NMM_PROC_BR NMM_CID CPAV_PROC_BR CPAV_CID # 1 09081997 1 0 0 1 # 2 13122006 1 1 0 1 # 3 09081997 0 1 0 0 # 4 22031969 1 0 1 1
处理需求
- 以
grupoaih为分组依据,针对组内存在重复值的分组:- 对
NMM_PROC_BR、NMM_CID、CPAV_PROC_BR、CPAV_CID这4个变量,若组内该变量至少有一个值为1,则将组内所有行的该变量统一设为1 - 若组内某变量所有值均为0,则保持原数值不变
- 对
期望输出结果
data2 <- data.frame(grupoaih = c("09081997", "13122006", "09081997", "22031969"), NMM_PROC_BR = c(1, 1, 1, 1), NMM_CID = c(1, 1, 1, 0), CPAV_PROC_BR = c(0, 0, 0, 1), CPAV_CID = c(1, 1, 1, 1)) # 输出预览 # grupoaih NMM_PROC_BR NMM_CID CPAV_PROC_BR CPAV_CID # 1 09081997 1 1 0 1 # 2 13122006 1 1 0 1 # 3 09081997 1 1 0 1 # 4 22031969 1 0 1 1
实现代码
使用dplyr包可以简洁实现需求:
library(dplyr) data2 <- data %>% group_by(grupoaih) %>% mutate( across( c(NMM_PROC_BR, NMM_CID, CPAV_PROC_BR, CPAV_CID), ~ifelse(any(.x == 1), 1, .x) ) ) %>% ungroup() # 查看结果 print(data2)
代码说明
group_by(grupoaih):按grupoaih列分组across(...):批量处理指定的4个变量ifelse(any(.x == 1), 1, .x):检查当前组内该变量是否存在1,存在则替换为1,否则保留原值ungroup():取消分组,恢复数据框结构
内容的提问来源于stack exchange,提问作者Lana Meijinhos
相关产品推荐
相关产品推荐

