为什么dplyr摘要na.rm不工作?

bf1o4zei  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(113)

在我的代码中,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不是吗?

k10s72fa

k10s72fa1#

如@akrun所述,sd(..., na.rm = TRUE)在计算标准差时会降低NA值,但具有单个值的组仍将生成NA
@CarlWitthoft指出,NA才是正确答案:虽然您 * 可以 * 将NA值替换为零,但可能您 * 不应该 *(即,无法估计只有一个样本的组的组内变异性估计值...)
如果你已经考虑过了,并且决定**对于你的用例来说,**将sd(numeric(0))定义为0是有意义的,你可以通过如下方式来修复这个问题:

my_data |> tidyr::replace_na(list(sd=0))

或者,您可以编写自己的sd() Package 器:

my_sd <- function(x, na.rm = FALSE) {
   if (length(x) <= 1) return(0)
   sd(x, na.rm = na.rm)
}

相关问题