提问人:rajvijay 提问时间:4/12/2016 最后编辑:radhikesh93rajvijay 更新时间:2/19/2020 访问量:7679
使用 dplyr 对多列求和时忽略 NA
Ignoring NA when summing multiple columns with dplyr
问:
我正在对多个列进行求和,其中一些列具有 NA。我正在使用
dplyr::mutate
然后写出列的算术总和以获得总和。但是这些列有 NA,我想将它们视为零。我能够让它与 rowSums 一起使用(见下文),但现在使用 mutate。使用 mutate 可以使其更具可读性,但也可以让我减去列。示例如下。
require(dplyr)
data(iris)
iris <- tbl_df(iris)
iris[2,3] <- NA
iris <- mutate(iris, sum = Sepal.Length + Petal.Length)
如何确保在上述表达式中将 Petal.Length 中的 NA 处理为零?我知道使用 rowSums 我可以做类似的事情:
iris$sum <- rowSums(DF[,c("Sepal.Length","Petal.Length")], na.rm = T)
但是使用 mutate 更容易设置偶数 diff = Sepal.Length - Petal.Length。 使用 mutate 实现此目的的建议方法是什么?
请注意,该帖子类似于下面的 stackoverflow 帖子。
答:
5赞
Gregor Thomas
4/12/2016
#1
你的问题在于对(未定义)的引用。这工作原理:rowSums
DF
mutate(iris, sum2 = rowSums(cbind(Sepal.Length, Petal.Length), na.rm = T))
为了区别,您当然可以使用否定:rowSums(cbind(Sepal.Length, -Petal.Length), na.rm = T)
一般的解决方案是使用或类似方式将缺失值设置为 0(或其他任何合适的值):ifelse
mutate(iris, sum2 = Sepal.Length + ifelse(is.na(Petal.Length), 0, Petal.Length))
比实现更有效,请参阅此处的示例。这使用上一个链接中@krlmlr的答案(请参阅底部的代码或使用 kimisc 包)。ifelse
coalesce
mutate(iris, sum2 = Sepal.Length + coalesce.na(Petal.Length, 0))
为了替换数据集范围内的缺失值,包中有。replace_na
tidyr
@krlmlr,如此处所示 coalesce.na
coalesce.na <- function(x, ...) {
x.len <- length(x)
ly <- list(...)
for (y in ly) {
y.len <- length(y)
if (y.len == 1) {
x[is.na(x)] <- y
} else {
if (x.len %% y.len != 0)
warning('object length is not a multiple of first object length')
pos <- which(is.na(x))
x[pos] <- y[(pos - 1) %% y.len + 1]
}
}
x
}
评论