RowSums NA + NA给出0

时间:2016-07-23 17:01:12

标签: r

我只是理解(对我而言)函数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
我错过了什么吗?

感谢所有

2 个答案:

答案 0 :(得分:6)

rowSums的一个选项是将rowSumsna.rm=TRUE相乘,并与否定的!} rowSums相乘({{1}在将具有所有NA的行转换为NA(!)后,基于NA值的逻辑矩阵

NA^

答案 1 :(得分:5)

由于

<script style='text/javascript'>
jQuery(document).ready(function(){
jQuery(&#39;.button_1&#39;).click(function(){
jQuery(&#39;.content_1&#39;).show();
jQuery(&#39;.content_2&#39;).hide();
jQuery(&#39;.content_3&#39;).hide();
jQuery(&#39;.content_4&#39;).hide();
jQuery(&#39;.content_5&#39;).hide();
jQuery(&#39;.content_6&#39;).hide();
jQuery(&#39;.content_7&#39;).hide();
jQuery(&#39;.content_8&#39;).hide();
jQuery(&#39;.content_9&#39;).hide();
jQuery(&#39;.content_10&#39;).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