我只是理解(对我而言)函数rowSums
的奇怪行为。想象一下,我有这个超级简单的数据框:
a = c(NA, NA,3)
b = c(2,NA,2)
df = data.frame(a,b)
df
a b
1 NA 2
2 NA NA
3 3 2
现在我想要第三列,这是另外两列的总和。由于+
,我无法使用 NA
:
df$c <- df$a + df$b
df
a b c
1 NA 2 NA
2 NA NA NA
3 3 2 5
但如果我使用rowSums
,则NA
的行计算为0,而如果只有NA
,则一切正常:
df$d <- rowSums(df, na.rm=T)
df
a b c d
1 NA 2 NA 2
2 NA NA NA 0
3 3 2 5 10
我错过了什么吗?
感谢所有
答案 0 :(得分:6)
rowSums
的一个选项是将rowSums
与na.rm=TRUE
相乘,并与否定的!
} rowSums
相乘({{1}在将具有所有NA的行转换为NA(!
)后,基于NA值的逻辑矩阵
NA^
答案 1 :(得分:5)
由于
<script style='text/javascript'>
jQuery(document).ready(function(){
jQuery('.button_1').click(function(){
jQuery('.content_1').show();
jQuery('.content_2').hide();
jQuery('.content_3').hide();
jQuery('.content_4').hide();
jQuery('.content_5').hide();
jQuery('.content_6').hide();
jQuery('.content_7').hide();
jQuery('.content_8').hide();
jQuery('.content_9').hide();
jQuery('.content_10').hide();
return true;
});
在sum(numeric(0))
# 0
中使用na.rm = TRUE
后,第二行为rowSums
。取numeric(0)
后,它为0。
如果您想为所有sum
个案件保留NA
,那么这将是一个两阶段的工作。我建议为此目的编写一个小函数:
NA
如果输入my_rowSums <- function(x) {
if (is.data.frame(x)) x <- as.matrix(x)
z <- base::rowSums(x, na.rm = TRUE)
z[!base::rowSums(!is.na(x))] <- NA
z
}
my_rowSums(df)
# [1] 2 NA 10
是数据框(如您的情况),这可能特别有用。 x
首先检查输入是否为矩阵。如果它获得数据帧,它将首先将其转换为矩阵。事实上,类型转换比实际行和计算更昂贵。请注意,我们两次致电base::rowSums
。为了减少类型转换开销,我们应该事先确保base::rowSums
是一个矩阵。
对于@ akrun的“黑客”答案,我建议:
x