对行进行求和,将NAs留在R

时间:2017-01-09 20:41:09

标签: r

在R中,我想对行进行求和,但如果整行是NA,则将NA保持为NA。我的数据包含0,我想这样计算它们。 E.g:

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,我会让所有NAs一路下来。我想在全NA行中获得NA。

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

谢谢!

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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。

答案 2 :(得分:1)

使用此方法获取总数,然后使用您的数据框cbind

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

答案 3 :(得分:1)

像上面的回答一样的两个步骤(但更短):

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

答案 4 :(得分:1)

使用Dplyr(一步);

EntityManagerFactory