在R tidyverse中为缺失值少于2个的行替换NA为0并重算sum列
解决tibble指定列按行条件替换NA并重新计算行和的问题
需求说明
针对tibble数据的var1:var6列,仅对该列范围内缺失值少于2个的行,将其中的NA替换为0,随后重新计算sum列。
可行实现方案
方案1:使用rowwise()逐行处理
library(tidyverse) set.seed(40) dat <- tibble( id = 1:6, var1 = sample(c(0:4, NA), 6, replace = TRUE), var2 = sample(c(0:4, NA), 6, replace = TRUE), var3 = sample(c(0:4, NA), 6, replace = TRUE), var4 = sample(c(0:4, NA), 6, replace = TRUE), var5 = sample(c(0:4, NA), 6, replace = TRUE), var6 = sample(c(0:4, NA), 6, replace = TRUE), ) new_dat <- dat %>% rowwise() %>% # 统计当前行var1:var6的缺失值数量 mutate(na_count = sum(is.na(c_across(var1:var6)))) %>% # 仅对缺失值<2的行替换NA为0 mutate(across(var1:var6, ~ifelse(na_count < 2, replace_na(., 0), .))) %>% # 重新计算sum列(保留NA行的sum为NA) mutate(sum = sum(c_across(var1:var6), na.rm = FALSE)) %>% # 移除临时统计列 select(-na_count) %>% ungroup() new_dat
方案2:向量化处理(无rowwise(),效率更高)
如果数据集较大,推荐用向量化方法替代行分组,避免性能损耗:
new_dat <- dat %>% # 用rowSums统计每行var1:var6的缺失值数量 mutate(na_count = rowSums(is.na(select(., var1:var6)))) %>% # 条件替换NA为0 mutate(across(var1:var6, ~ifelse(na_count < 2, replace_na(., 0), .))) %>% # 重新计算行和 mutate(sum = rowSums(select(., var1:var6), na.rm = FALSE)) %>% select(-na_count)
结果验证
运行上述代码后,输出结果与期望一致:
# A tibble: 6 × 8 id var1 var2 var3 var4 var5 var6 sum <int> <int> <int> <int> <int> <int> <int> <int> 1 1 3 4 4 NA NA 2 NA 2 2 NA NA 4 3 4 2 NA 3 3 4 4 1 1 4 1 15 4 4 1 2 4 4 4 0 15 5 5 2 1 4 4 0 2 13 6 6 1 3 1 0 0 4 9
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

