执行z规范化时如何在列中排除NA值

时间:2017-02-25 11:29:29

标签: r dplyr normalization missing-data

我需要对我的数据进行z标准化(即将变量转换为平均值= 0和sd = 1)。

我使用以下公式(例如缩放平均年温度," MAT"):

sca$MAT <- (sca$MAT - mean(sca$MAT)) / sd(sca$MAT)

但是我得到了NaN值,因为这个变量缺少很少的数据。如何在上述公式中排除MAT的NA值?

PS:我尝试在公式中加入na.rm=TRUE,但它不起作用。

here所示,更快的方法可能会使用dplyr:但我遇到同样的问题

3 个答案:

答案 0 :(得分:0)

快速解决方案是使用 is.na 函数来获取NA元素的索引,然后将其删除。命令如下:

clean <- sca$MAT[-is.na(sca$MAT)] standardized <- (clean - mean(clean)) / sd(clean)

答案 1 :(得分:0)

scale将为您排除NA

x <- c(1:5,NA)
scale(x)
           [,1]
[1,] -1.2649111
[2,] -0.6324555
[3,]  0.0000000
[4,]  0.6324555
[5,]  1.2649111
[6,]         NA
attr(,"scaled:center")
[1] 3
attr(,"scaled:scale")
[1] 1.581139

所以sca$MAT <- scale(sca$MAT)应该做你需要的。

答案 2 :(得分:0)

使用na.rm=TRUE应该有效

例如:

> sca <- data.frame(L=LETTERS[1:6], MAT=c(1:5,NA))
> sca
  L MAT
1 A   1
2 B   2
3 C   3
4 D   4
5 E   5
6 F  NA
> sca$MAT <- (sca$MAT - mean(sca$MAT, na.rm=TRUE)) / sd(sca$MAT, na.rm=TRUE)
> sca
  L        MAT
1 A -1.2649111
2 B -0.6324555
3 C  0.0000000
4 D  0.6324555
5 E  1.2649111
6 F         NA

与Glen_b使用scale

的结果相同