对大量向量求和;按行或按元素,但忽略 NA 值

问题描述 投票:0回答:3

我正在尝试创建一个新向量,它是其他 35 个向量的总和。问题是有很多 NA 值,但对于这种特殊用途,我想将它们视为零。将向量相加不起作用,因为如果 35 个向量中的任何一个包含 NA,则结果为 NA。这是问题的示例:

col1<-c(NA,1,2,3)
col2<-c(1,2,3,NA)
col3<-c(NA,NA,2,3)
Sum<-col1+col2+col3
Sum
# [1] NA NA  7 NA

我希望结果是 1, 3, 7, 6。
我想我可以为每个向量创建新版本,其中将 NA 替换为 0,但是当应用于 35 个向量时,这将是大量工作。有一个简单的功能可以帮助我吗?

r vector sum na
3个回答
36
投票

也可以使用

rowSums
功能:

rowSums( cbind (col1,col2,col3), na.rm=TRUE)
#[1] 1 3 7 6

?rowSums   # also has colSums described on same help page

7
投票

先将它们放入矩阵中:

apply(cbind(col1,col2,col3),1,sum,na.rm = TRUE)
[1] 1 3 7 6

您可以使用 R 的内置文档在此处阅读每个函数:

?apply
?cbind

cbind
代表“列绑定”:它需要多个向量或数组并将它们“按列”绑定到单个数组中:

cbind(col1,col2,col3)
     col1 col2 col3
[1,]   NA    1   NA
[2,]    1    2   NA
[3,]    2    3    2
[4,]    3   NA    3

apply
,嗯,将函数(在本例中为sum
)应用于矩阵的行或列。这允许我们使用 
na.rm = TRUE
 参数来 
sum
 以便删除 NA 值。


0
投票
对于

tidyverse

的答案,我想说你必须使用
sum()
将函数
rowwise()
(通常是汇总函数)转换为向量化函数。这将允许您将 
sum
 转换为多输入运算符,您可以向其传递 
na.rm = TRUE
 参数,如下所示:

t <- tibble(col1, col2, col3) t %>% rowwise() %>% mutate(sum = sum(col1, col2, col3, na.rm = TRUE))
或者如果您不喜欢管道

t2 <- rowwise(t) t2 <- mutate(t2, sum = sum(col1, col2, col3, na.rm = TRUE))
要提取表格的最后一列,您可以执行以下操作

select(t2, sum)
或者如果你想要它作为向量

pull(t2, sum)
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.