如何使用dplyr根据分组内特定值的存在情况修改同组其他值
R数据框分组替换实现方案
需求说明
按group字段分组处理:
- 若分组内存在以
M开头的取值(仅MC、MA两种情况),将组内所有非NA的value值统一替换为该M开头的取值 - 原有NA值保持不变
- 无M开头取值的分组不做修改
实现代码
library(dplyr) library(stringr) # 构造原始数据 df <- structure(list(group = c("A", "A", "A", "B", "B", "B", "C", "C", "C", "D", "D", "D"), type = c("T1", "T2", "T3", "T1", "T2", "T3", "T1", "T2", "T3", "T1", "T2", "T3"), value = c("MC", "C", NA, "C", "C", NA, "MA", "A", "A", NA, "MA", "MA")), row.names = c(NA, -12L), class = c("tbl_df", "tbl", "data.frame")) # 分组处理 df_result <- df %>% group_by(group) %>% mutate( # 提取当前组内M开头的取值(每组最多一个) m_val = first(na.omit(value[str_starts(value, "^M")])), # 替换逻辑:存在对应M值且当前value非NA则替换,否则保留原值 value = ifelse(!is.na(m_val) & !is.na(value), m_val, value) ) %>% ungroup() %>% select(-m_val) # 删除临时辅助列 # 查看结果 print(df_result)
如果不想额外依赖stringr包,也可以把str_starts(value, "^M")替换为grepl("^M", value),仅用base R函数即可实现相同效果。
输出结果
运行后得到的结果与预期完全一致:
# A tibble: 12 × 3 group type value <chr> <chr> <chr> 1 A T1 MC 2 A T2 MC 3 A T3 NA 4 B T1 C 5 B T2 C 6 B T3 NA 7 C T1 MA 8 C T2 MA 9 C T3 MA 10 D T1 NA 11 D T2 MA 12 D T3 MA
内容的提问来源于stack exchange,提问作者Mohan Govindasamy
相关产品推荐
相关产品推荐

