如何在dplyr中忽略缺失值且不删除行,完成数据标准化?
解决含NA列的标准化问题
你遇到的核心问题是mean()和sd()默认不会忽略NA值,而且你把na.rm=TRUE放错了位置——它应该传给mean()和sd()内部,而不是mutate()的参数。下面是两种可行的解决方法:
方法一:自定义函数中添加na.rm=TRUE
直接在计算均值和标准差时指定忽略NA,既能保留原数据中的NA位置,又能正常计算非NA值的标准化结果:
df1 = df1 %>% mutate(across(.cols = A:C, .f = function(x){(x - mean(x, na.rm = TRUE)) / sd(x, na.rm = TRUE)} ))
方法二:使用内置的scale()函数
R的scale()函数本身就是实现(x-mean(x))/sd(x)标准化的工具,它内部默认会忽略NA值,代码更简洁:
df1 = df1 %>% mutate(across(A:C, scale))
补充说明
- 原代码中,只要列存在NA,
mean(x)和sd(x)就会返回NA,导致整列计算结果全为NA; - 两种方法都不会删除任何行,只会保留原数据中的NA位置,同时对非NA值完成标准化;
scale()函数还支持额外参数(如center=FALSE或scale=FALSE),如果只需要中心化或只需要缩放可以灵活调整。
内容的提问来源于stack exchange,提问作者DunkinDont
相关产品推荐
相关产品推荐

