全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
相关产品推荐
相关产品推荐

