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

全NA行rowSums返回0如何修正?contains选列是否正确?

问题与解决方案

问题背景

现有如下R数据集:

df <- data.frame(var1=c(NA, 3, 3, 4, 0),
                 var2=c(NA, 2, 5, 3, NA),
                 var3=c(NA, 3, 6, 6, NA),
                 var4=c(NA, 1, 2, 14, NA))

执行以下代码计算每行的和:

df %>% mutate(sumVar = select(., contains("var")) %>% rowSums(,na.rm=T)) 

得到结果中,全为NA的第一行求和结果为0,需要修正为NA;同时疑问:真实数据集有500列,需选择以"var"开头的列,使用contains()是否正确?

解决方案

1. 修正全NA行求和结果为NA

可以通过判断每行是否全部为NA,再决定返回求和结果还是NA,用dplyr有两种简洁实现方式:

方式一:结合rowSums和ifelse判断每行NA数量是否等于所选列总数:

df %>%
  mutate(
    temp = select(., starts_with("var")),
    sumVar = ifelse(rowSums(is.na(temp)) == ncol(temp), 
                    NA, 
                    rowSums(temp, na.rm = TRUE))
  ) %>%
  select(-temp)

方式二:直接替换全NA行的求和结果:

df %>%
  mutate(
    sumVar = rowSums(select(., starts_with("var")), na.rm = TRUE),
    sumVar = replace(sumVar, rowSums(is.na(select(., starts_with("var")))) == ncol(select(., starts_with("var"))), NA)
  )

两种方式都会得到正确结果:

var1 var2 var3 var4 sumVar
1   NA   NA   NA   NA     NA
2    3    2    3    1      9
3    3    5    6    2     16
4    4    3    6   14     27
5    0   NA   NA   NA      0

2. 列选择函数的正确性

contains("var")会匹配任何包含"var"字符串的列名,比如abcvar、xvarx这类列都会被选中,容易误选无关列。

如果你需要的是以"var"开头的列,应该使用starts_with("var"),这个函数仅匹配列名以"var"开头的列,更精准,适合你有500列的大数据集。

内容的提问来源于stack exchange,提问作者newfinder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:25:15