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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 07:45:02