如何用mutate_at和if_else批量替换多列NA值为对应_max列值?
批量替换多列NA值为对应分组最大值的解决方案
先解决基础报错问题
报错could not find function "%>%"是因为未加载dplyr或tidyverse工具包,先执行以下代码加载依赖:
library(tidyverse)
完整批量处理代码
以下代码可自动适配所有以value开头的列,无需手动指定数百个列名:
# 加载必要工具包 library(tidyverse) # 示例数据 group1 = c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2) group2 = c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3) group3 = c(NA,0,1,NA,0,1,NA,0,1,NA,0,1,NA,0,1,NA,0,1) value1 = c(100,NA,NA,500,600,400,NA,NA,100,150,NA,NA,600,700,500,NA,NA,200) value2 = c(100,200,150,200,300,500,NA,NA,NA,200,400,300,400,600,100,NA,NA,NA) value3 = c(100,12,234,500,600,400,345,345,100,150,234,354,600,700,500,325345,324,200) df = data.frame(group1=group1, group2=group2, group3=group3, value1=value1, value2=value2, value3=value3) # 预期结果数据框 group1_ = c(1,1,1,1,1,1,2,2,2,2,2,2) group2_ = c(1,1,2,2,3,3,1,1,2,2,3,3) group3_ = c(0,1,0,1,0,1,0,1,0,1,0,1) value1_ = c(100,100,600,400,NA,100,150,150,700,500,NA,200) value2_ = c(200,150,300,500,NA,NA,400,300,600,100,NA,NA) value3_ = c(100,234,600,400,345,100,234,354,700,500,325345,200) df_wanted = data.frame(group1=group1_, group2=group2_, group3=group3_, value1=value1_, value2=value2_, value3=value3_) # 批量处理逻辑 df_processed <- df %>% # 替换group3列的NA为0 mutate(group3 = if_else(is.na(group3), 0, group3)) %>% # 按group1/group2/group3分组,取各列最大值 group_by(group1, group2, group3) %>% summarise(across(everything(), ~max(., na.rm = TRUE)), .groups = 'drop') %>% # 将max计算产生的-Inf转回NA na_if(-Inf) %>% # 按group1/group2分组,为所有value开头的列生成对应_max后缀的最大值列 group_by(group1, group2) %>% mutate(across(starts_with("value"), ~max(., na.rm = TRUE), .names = "{.col}_max")) %>% # 再次处理max计算产生的-Inf na_if(-Inf) %>% # 批量替换每个value列的NA为对应的_max列的值 mutate(across(starts_with("value"), ~if_else(is.na(.), get(str_c(cur_column(), "_max")), .))) %>% # 可选:删除临时生成的_max列(不需要保留可执行此行) select(-ends_with("_max")) # 验证结果是否匹配预期 all.equal(df_processed, df_wanted)
核心批量处理逻辑说明
- 使用
starts_with("value")自动匹配所有以value开头的列,无需手动枚举数百个列名 across的.names参数自动生成带_max后缀的分组最大值列- 通过
cur_column()动态获取当前处理的列名,配合get()调用对应_max列实现NA替换 - 全程使用tidyverse现代语法,替代已淘汰的
mutate_at,兼容性和可读性更强
内容的提问来源于stack exchange,提问作者Alibek Galiyev
相关产品推荐
相关产品推荐

