为什么 mean(NA, na.rm = TRUE) 返回 NaN?

7

当使用一个全为 NA 的向量估计均值时,如果 na.rm = TRUE,我们会得到一个 NaN。为什么会这样,这是错误的逻辑还是我漏掉了什么?毫无疑问,使用 NA 而不是 NaN 更有意义。

以下是一个快速示例:

mean(NA, na.rm = TRUE)
#[1] NaN

mean(rep(NA, 10), na.rm = TRUE)
#[1] NaN

1
因为你现在有一个长度为零的向量,并且零除以任何数都是NaN。至于是否更合理,我认为不是,因为你已经删除了缺失值。 - Rui Barradas
5
因为你已经失去了所有的东西。 mean(numeric(0)) 的意思是计算空数值向量的平均值。 - Zheyuan Li
请注意,mean(as.Date(NA), na.rm = TRUE) 的结果是 NA 而不是 NaN。 - Dan Chaltiel
2个回答

8
有点遗憾的是,?mean没有提到这一点。 我在 我的评论 中告诉你,在空的 "numeric" 上应用 mean 会导致结果为 NaN,但没有更多的解释。 Rui Barradas's 评论 尝试解释了这一点,但不准确,因为除以 0 不总是 NaN,它可以是 Inf-Inf。我曾在 R: element-wise matrix division 中讨论过这个问题。然而,我们正在接近答案。虽然 mean(x) 不是由 sum(x) / length(x) 编写的,但这个数学事实确实解释了这个 NaN
?sum: 开始:
 *NB:* the sum of an empty set is zero, by definition.

因此,sum(numeric(0))0。由于numeric(0)的长度为0,所以mean(numeric(0))0 / 0,也就是NaN


关于NaN的进一步阅读:在R中,为什么is.numeric(NaN)会打印“TRUE”?。此外,读者应该了解到median(numeric(0))返回NAmin(numeric(0))返回Infmax(numeric(0))返回-Inf。它们为什么会这样行为在文档页面?median?min中有解释。 - Zheyuan Li

2

来自mean文档:

na.rm 一个逻辑值,指示在计算之前是否应该删除NA值。

按照这种逻辑,在应用函数mean之前,所有NA都将被删除。在您的情况下,您将mean应用于空值(所有NA都已删除),因此返回NaN。


我相信它不会返回NULL,因为r仍然将向量识别为数字,即使它包含所有缺失值。例如,即使您删除了NA值,这也会引发警告:mean(c(NA_character_),na.rm = TRUE)。关于numeric(0)的观点很有趣。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接