在 R 中添加时删除 NA
Remove NA's when adding in R
我正在尝试在 R 中添加两个矩阵,我希望添加将任何 NA 视为 0。我知道我总是可以做这样的事情:
ifelse(is.na(A), 0, A) + ifelse(is.na(B), 0, B)
但似乎应该有更优雅的方式来做到这一点。例如,是否有某种方法可以向 + 函数提供 na.rm 参数?
假设"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
或者我们可以使用 replace
而不是 ifelse
,这样会更快一些
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)))
另一个紧凑的选项是使用 qdap
中的 NAer
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)
您可以尝试 car
包中的 recode
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
我正在尝试在 R 中添加两个矩阵,我希望添加将任何 NA 视为 0。我知道我总是可以做这样的事情:
ifelse(is.na(A), 0, A) + ifelse(is.na(B), 0, B)
但似乎应该有更优雅的方式来做到这一点。例如,是否有某种方法可以向 + 函数提供 na.rm 参数?
假设"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
或者我们可以使用 replace
而不是 ifelse
,这样会更快一些
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)))
另一个紧凑的选项是使用 qdap
NAer
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)
您可以尝试 car
包中的 recode
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