在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))
谢谢!
答案 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