我在多个列中进行求和,其中一些列有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
答案 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的tidyr
,as found here
coalesce.na