使用dplyr对多列求和时忽略NA

拉杰维杰

我汇总了多个列,其中一些包含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帖子。

使用dplyr跨多列求和

减去多列忽略NA

格雷戈尔·托马斯(Gregor Thomas)

您的问题rowSums是对的引用DF(未定义)。这有效:

mutate(iris, sum2 = rowSums(cbind(Sepal.Length, Petal.Length), na.rm = T))

为了区别,您当然可以使用负数: rowSums(cbind(Sepal.Length, -Petal.Length), na.rm = T)

通用解决方案是使用ifelse或类似方法将缺失值设置为0(或其他合适的值):

mutate(iris, sum2 = Sepal.Length + ifelse(is.na(Petal.Length), 0, Petal.Length))

ifelse实现的效率更高coalesce请参见此处的示例这使用上一个链接中的@krlmlr的答案(有关代码,请参见底部或使用kimisc包)。

mutate(iris, sum2 = Sepal.Length + coalesce.na(Petal.Length, 0))

要替换整个数据集中的缺失值,请replace_natidyr包装中提供。


@ krlmlr's 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
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章