【问题标题】:Summing lots of Vectors; row-wise or elementwise, but ignoring NA values汇总大量向量;按行或按元素,但忽略 NA 值
【发布时间】:2013-12-04 23:33:04
【问题描述】:

我正在尝试创建一个新向量,它是 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


    【解决方案1】:

    也可以使用rowSums 函数:

    rowSums( cbind (col1,col2,col3), na.rm=TRUE)
    #[1] 1 3 7 6
    
    ?rowSums   # also has colSums described on same help page
    

    【讨论】:

    • 不错!这样我就不必告诉 Apply 该函数适用于一行。
    • 用大数据也快很多。
    【解决方案2】:

    先把它们放在一个矩阵中:

    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)到矩阵的行或列。这允许我们使用 sumna.rm = TRUE 参数,以便删除 NA 值。

    【讨论】:

    • 这行得通!我似乎问了一个相当基本的问题,但如果您可以添加一两个链接来帮助解释为什么此代码有效,我将不胜感激。
    • 1在apply中代表什么?我的意思是出现在列列表和 sum 函数之间的 1。
    • 啊哈!行,而不是列。 (顺便说一句,我在询问之前确实尝试过阅读那篇文章,但我无法弄清楚)
    猜你喜欢
    • 2019-01-22
    • 2021-06-30
    • 2021-09-06
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多