含缺失值时使用summarize across计算标准误的问题
分组计算标准误时处理缺失值的正确方法
问题场景
需要按Species分组,为多个数值列计算标准误(公式:标准差 / sqrt(观测数)),但数据存在缺失值,导致原代码计算结果为NA,不清楚na.rm=TRUE参数的正确放置位置。
原始数据示例
Species Trait 1 Trait 2 Species 1 Species 1 Species 1 Species 2 Species 2 Species 2
期望输出
Trait 1_se Trait 2_se Species 1 Species 2
原可运行但无法处理缺失值的代码
Data_ok %>% group_by(Species) %>% summarise(across(where(is.numeric), ~ sd(.x)/ sqrt(length(.x)), .names = "{.col}_se"))
解决方案
na.rm=TRUE需要放在sd()函数的参数里,同时要注意:直接用length(.x)会把缺失值计入观测数,导致标准误计算不准确,应该改用sum(!is.na(.x))统计非缺失值的数量。修正后的代码如下:
Data_ok %>% group_by(Species) %>% summarise(across(where(is.numeric), ~ sd(.x, na.rm = TRUE) / sqrt(sum(!is.na(.x))), .names = "{.col}_se"))
关键说明
- 在
sd(.x, na.rm = TRUE)中添加参数,让标准差计算自动忽略缺失值; - 用
sum(!is.na(.x))替代length(.x),确保分母是实际有效观测值的数量,避免缺失值干扰标准误的计算逻辑。
内容的提问来源于stack exchange,提问作者Félix de Tombeur
相关产品推荐
相关产品推荐

