R中部分/完全缺失数据求和的自定义需求解决方案问询
需求与问题
我手头的数据存在部分缺失和完全缺失两种情况,期望实现:
- 部分缺失的数据求和:返回非缺失值的总和
- 完全缺失的数据求和:返回缺失值(NA)
但使用base R自带的sum()函数并设置na.rm = TRUE时,完全缺失的向量求和会返回0,不符合需求,示例如下:
> sum(c(1,NA,2), na.rm = TRUE) [1] 3 > sum(c(NA,NA,NA), na.rm = TRUE) [1] 0 > sum(c(1,NaN,2), na.rm = TRUE) [1] 3 > sum(c(NaN,NaN,NaN), na.rm = TRUE) [1] 0
Base R 解决方案
自定义一个求和函数,先判断向量是否全部为缺失值(包含NA和NaN),再返回对应结果:
sum_na_smart <- function(x) { all_missing <- all(is.na(x)) if (all_missing) { NA } else { sum(x, na.rm = TRUE) } }
测试验证:
> sum_na_smart(c(1,NA,2)) [1] 3 > sum_na_smart(c(NA,NA,NA)) [1] NA > sum_na_smart(c(1,NaN,2)) [1] 3 > sum_na_smart(c(NaN,NaN,NaN)) [1] NA
Tidyverse 解决方案
借助dplyr的条件判断函数实现,适合在数据框中批量处理列:
library(dplyr) # 单个向量的求和函数 sum_na_smart_tidy <- function(x) { case_when( all(is.na(x)) ~ NA_real_, TRUE ~ sum(x, na.rm = TRUE) ) } # 数据框批量处理示例 df <- tibble( col1 = c(1, NA, 2), col2 = c(NA, NA, NA), col3 = c(1, NaN, 2), col4 = c(NaN, NaN, NaN) ) df %>% mutate(across(everything(), sum_na_smart_tidy))
运行后,完全缺失的列会返回NA,部分缺失的列返回非缺失值的总和,符合需求。
内容的提问来源于stack exchange,提问作者David Miller
相关产品推荐
相关产品推荐

