【问题标题】:Sum to 0 if vector includes NAs and 0?如果向量包含 NA 和 0,则总和为 0?
【发布时间】:2021-04-30 13:37:55
【问题描述】:

我遇到了一个有趣的问题,试图让我的 R 结果与同事的 SPSS 结果保持一致。似乎在 SPSS 中,求和时,NA + NA = NA0 + NA = 0,但在 R 中,我似乎无法重现这一点。在 R 中,要么总和为 NA,要么都总和为 0。但是,在我的情况下,如果 sum 命令中的所有值都丢失,它们应该是 NA,但至少有一个 0,它应该是 0。

nana <- c(NA, NA)
na0 <- c(NA, 0)
sum(nana) # sums to NA
sum(na0) # sums to  NA
sum(nana, na.rm=T) # sums to 0
sum(na0, na.rm=T) # sums to 0

我找到了这个答案,Treat NA as zero only when adding a number,但是当在多个向量中使用sum 时它不起作用,就像在sum(x,y,z) 中一样

【问题讨论】:

    标签: r


    【解决方案1】:

    似乎您只想制作自己的自定义函数来获得该功能。

    modSum <- function(x){
      if(all(is.na(x))){return(NA)}
      sum(x, na.rm = TRUE)
    }
    

    亲眼目睹

    > nana <- c(NA, NA)
    > na0 <- c(NA, 0)
    > sum(nana) # sums to NA
    [1] NA
    > sum(na0) # sums to  NA
    [1] NA
    > sum(nana, na.rm=T) # sums to 0
    [1] 0
    > sum(na0, na.rm=T) # sums to 0
    [1] 0
    > modSum(nana)
    [1] NA
    > modSum(na0)
    [1] 0
    

    【讨论】:

      【解决方案2】:

      this answer 中的检查可以扩展到

      plus <- function(...) {
       if(all(is.na(do.call(c, list(...))))){
         NA} else {
         sum(...,na.rm = TRUE)}
       }
      plus(c(NA, 3), 1:5)
      # [1] 18
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2022-07-24
        • 1970-01-01
        • 2020-12-04
        • 2019-08-30
        • 1970-01-01
        相关资源
        最近更新 更多