在R的dplyr中计算Z分数时如何忽略NA值?
解决方法
问题出在mean()和sd()函数默认不会忽略NA值,只要在这两个函数中添加na.rm = TRUE参数,就能跳过NA计算均值和标准差,进而得到正确的Z分数。
修改后的代码如下:
library(tidyverse) data <- structure(list(Date = structure(c(18262, 18293, 18322, 18353), class = "Date"), a = c(NA, 1, 2, 3), b = c(NA, NA, 3, 5), c = c(NA, NA, NA, 4)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -4L)) data %>% mutate_if(is.numeric, .funs = ~(. - mean(., na.rm = TRUE))/sd(., na.rm = TRUE))
运行结果:
# A tibble: 4 × 4 Date a b c <date> <dbl> <dbl> <dbl> 1 2020-01-01 NA NA NA 2 2020-02-01 -1 NA NA 3 2020-03-01 0 -1 NA 4 2020-04-01 1 1 NA
如果使用的是较新版本的tidyverse,推荐用mutate(across())替代已软弃用的mutate_if(),语法更符合tidyverse最新规范:
data %>% mutate(across(where(is.numeric), ~(. - mean(., na.rm = TRUE))/sd(., na.rm = TRUE)))
内容的提问来源于stack exchange,提问作者Tanga94
相关产品推荐
相关产品推荐

