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

时间:2016-04-11 19:16:39

标签: r dataframe dplyr multiple-columns

我在多个列中进行求和,其中一些列有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可以建议的方法是什么?

注意帖子类似于

 http://stackoverflow.com/questions/28873057/sum-across-multiple-columns-with-dplyr
 http://stackoverflow.com/questions/23255318/subtract-multiple-columns-ignoring-na

1 个答案:

答案 0 :(得分:3)

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更高效的是[{1}},see examples here的实施。这使用了来自上一个链接的@ krlmlr的答案(请参阅底部的代码或使用kimisc package)。

coalesce

要在数据集范围内替换缺失值,mutate(iris, sum2 = Sepal.Length + coalesce.na(Petal.Length, 0)) 包中有replace_na

@ krlmlr的tidyras found here

coalesce.na