【问题标题】:summing across rows, leaving NAs in R跨行求和,将 NAs 留在 R 中
【发布时间】:2017-01-10 06:12:07
【问题描述】:

在 R 中,我想跨行求和,但如果整行为 NA,则将 NA 保留为 NA。我的数据包含 0,我想这样计算它们。例如:

colA  colB  colC  Total
 1     NA   2       3
 NA    NA   NA     NA
 0     NA   NA      0
 3     0    NA      3

我使用下面的代码,得到了所有 NA 行的 0。如果我将 na.rm 更改为 F,我会一直降低所有 NA。我想在全 NA 行中获得 NA。

Total <- as.data.frame(rowSums(df[,1:3], na.rm = T))

谢谢!

【问题讨论】:

  • @demongolem:请不要拒绝来自 OP 的添加可重现示例的编辑;它们不是“旨在解决帖子的作者并且没有任何意义作为编辑”。

标签: r


【解决方案1】:

您可以简单地在第二遍中更改结果:

dat <- data.frame(colA=c(1,NA,0,3),  colB=c(NA,NA,NA,0),  colC=c(2,NA,NA,NA))
 dat
  colA colB colC
1    1   NA    2
2   NA   NA   NA
3    0   NA   NA
4    3    0   NA
 res <- rowSums(dat,na.rm=T)
 res
[1] 3 0 0 3
 res[rowSums(is.na(dat))==3] <- NA
 res
[1]  3 NA  0  3
 dat <- data.frame(colA=c(1,NA,0,3),  colB=c(NA,NA,NA,0),  colC=c(2,NA,NA,NA))
 dat
  colA colB colC
1    1   NA    2
2   NA   NA   NA
3    0   NA   NA
4    3    0   NA
 res <- rowSums(dat,na.rm=T)
 res
[1] 3 0 0 3
 res[rowSums(is.na(dat))==3] <- NA
 res
[1]  3 NA  0  3

如果您想将其保存回您的数据中:

df$total <- res

【讨论】:

  • 我想保留 0,因为它在我的数据集中是一个有意义的值,所以我不希望所有 NA 行都归零。请参阅编辑/更正的帖子。
  • 我不太明白你要去哪里......在我看来,我的解决方案也适用于你更新的数据。
【解决方案2】:

您可以使用 NA 操作在一行中完成此操作。

rowSums(df, na.rm=TRUE) * NA^(rowSums(is.na(df)) == length(df))
[1]  3 NA  0  3

在这里,第一个 rowSums 在删除 NA 时获取总和。然后将其乘以NA^(rowSums(is.na(df)) == length(df)),它在所有情况下都返回 NA,除非指数项为 0(或 FALSE)。在这种情况下,当行中至少有一个元素为非 NA 时,就会出现 FALSE。

【讨论】:

  • 感谢差异方法
【解决方案3】:

用它来得到总数,然后用你的数据框cbind它。

apply(df,1,function(x){if (sum(is.na(x)) == length(x)){
    return(NA)
}else{
    sum(x,na.rm = T)
}
    })

【讨论】:

    【解决方案4】:

    与上述答案类似的两个步骤(但更短):

    sums <- rowSums(df, na.rm=TRUE)
    allna <- apply(df,1, function(x)all(is.na(x)))
    sums[allna] <- NA
    

    【讨论】:

      【解决方案5】:

      使用 Dplyr(一步);

      t1<- data.frame ( A=c(1,NA,0,3),
                    B=c(NA,5,NA,0),
                    C=c(2,NA,NA,NA))
      t1<-t1 %>% rowwise() %>% mutate(Total=sum(A,B,C,na.rm=T))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-31
        • 2015-10-31
        • 2021-12-19
        • 1970-01-01
        • 1970-01-01
        • 2019-02-24
        • 1970-01-01
        相关资源
        最近更新 更多