在R中添加时删除NA

时间:2015-02-20 10:21:42

标签: r add na

我正在尝试在R中添加两个矩阵,并且我希望添加将任何NA视为0。我知道我总能做到这样的事情:

ifelse(is.na(A), 0, A) + ifelse(is.na(B), 0, B)

但似乎应该有更优雅的方式来做到这一点。例如,是否有某种方法可以将na.rm参数提供给+函数?

2 个答案:

答案 0 :(得分:3)

假设" A"和" B"具有相同的尺寸,

`dim<-`(colSums(rbind(c(A), c(B)), na.rm=TRUE), dim(A))
 #      [,1] [,2] [,3] [,4]
 #[1,]    4    7    6    6
 #[2,]    5    7    2    4
 #[3,]    8    9    6    1
 #[4,]    4    2    5    5

或者代替ifelse,我们可以使用replace,这会更快一点

  replace(A, is.na(A), 0) +replace(B, is.na(B), 0)
  #      [,1] [,2] [,3] [,4]
  #[1,]    4    7    6    6
  #[2,]    5    7    2    4
  #[3,]    8    9    6    1
  #[4,]    4    2    5    5

或者,如果有多个数据集,我们可以将其放在列表中并使用Reduce

 Reduce(`+`, lapply(list(A,B), function(x) replace(x, is.na(x), 0)))

另一个紧凑的选择是使用NAer

中的qdap
library(qdap)
NAer(A)+NAer(B)

对于多个数据集

Reduce(`+`, lapply(list(A,B), NAer))

数据

set.seed(324)
A <- matrix(sample(c(NA,1:5), 4*4, replace=TRUE), ncol=4)
set.seed(59)
B <- matrix(sample(c(NA,1:5), 4*4, replace=TRUE), ncol=4)

答案 1 :(得分:3)

您可以尝试recode

中的car
A <- matrix(c(1,NA,5,9,3,NA), 2)
B <- matrix(c(NA,10,3,NA,21,3), 2)

library(car)
Reduce("+", lapply(list(A, B), recode, "NA=0"))
#      [,1] [,2] [,3]
# [1,]    1    8   24
# [2,]   10    9    3