在我的代码中,sd函数中的na.rm=TRUE函数没有从我的表中删除Na。我不知道为什么会发生这种情况,也不知道如何修复这种情况。我知道我的一些数据点是单值的,所以sd应该是平均值旁边的0。
下面是我的表的dput()。
> dput(n11.stat)
structure(list(Family = structure(1:11, levels = c("Adoxaceae",
"Anacardiaceae", "Apiaceae", "Asteraceae", "Cornaceae", "Ericaceae",
"Fabaceae", "Oleaceae", "Pinaceae", "Plantaginaceae", "Rosaceae"
), class = "factor"), count = c(2L, 2L, 1L, 5L, 1L, 1L, 3L, 1L,
1L, 1L, 4L), mean = c(4.95, 5.285, 16.34, 24.286, 5.75, 15.13,
7.75333333333333, 44.39, 29.56, 9.01, 5.7), sd = c(2.67286363288515,
4.23556961930742, NA, 11.2702542118623, NA, NA, 3.17789762788755,
NA, NA, NA, 3.9851808825531)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -11L))
但我的输出总是这样:
Family count mean sd
<fct> <int> <dbl> <dbl>
1 Adoxaceae 2 4.95 2.67
2 Anacardiaceae 2 5.28 4.24
3 Apiaceae 1 16.3 NA
4 Asteraceae 5 24.3 11.3
5 Cornaceae 1 5.75 NA
6 Ericaceae 1 15.1 NA
7 Fabaceae 3 7.75 3.18
8 Oleaceae 1 44.4 NA
9 Pinaceae 1 29.6 NA
10 Plantaginaceae 1 9.01 NA
11 Rosaceae 4 5.7 3.99
NA应该是0不是吗?
1条答案
按热度按时间k10s72fa1#
如@akrun所述,
sd(..., na.rm = TRUE)
在计算标准差时会降低NA值,但具有单个值的组仍将生成NA
。@CarlWitthoft指出,
NA
才是正确答案:虽然您 * 可以 * 将NA
值替换为零,但可能您 * 不应该 *(即,无法估计只有一个样本的组的组内变异性估计值...)如果你已经考虑过了,并且决定**对于你的用例来说,**将
sd(numeric(0))
定义为0是有意义的,你可以通过如下方式来修复这个问题:或者,您可以编写自己的
sd()
Package 器: