如何实现rowSums在全NA行返回NA,非全NA行将NA视为0求和?
解决全NA行求和返回NA的需求
基础R实现
我们可以通过先判断每行是否全为NA,再结合rowSums完成需求:
- 先创建示例数据:
a <- c(5, NA, NA) b <- c(6, 6, NA) df <- data.frame(a, b)
- 计算每行非NA值的数量,再根据数量决定返回值:
# 统计每行非NA元素的个数 row_non_na_count <- rowSums(!is.na(df[, c("a", "b")])) # 生成求和列:全NA行返回NA,其他行将NA视为0求和 df$c <- ifelse(row_non_na_count == 0, NA, rowSums(df[, c("a", "b")], na.rm = TRUE))
运行后得到的结果完全符合预期:
a b c 1 5 6 11 2 NA 6 6 3 NA NA NA
dplyr实现(适配tidyverse工作流)
如果习惯使用dplyr,可以按行处理数据:
library(dplyr) df <- df %>% rowwise() %>% # 判断当前行a、b列是否全为NA,是则返回NA,否则求和(NA按0计算) mutate(c = if(all(is.na(c_across(a:b)))) NA else sum(c_across(a:b), na.rm = TRUE)) %>% ungroup()
该方法通过rowwise()开启按行操作,c_across(a:b)选中目标列,all(is.na(...))判断是否全NA,最终生成符合规则的求和列。
内容的提问来源于stack exchange,提问作者jikac
相关产品推荐
相关产品推荐

