You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:23:14