2017-02-25 61 views
0

我需要对我的数据执行z归一化(即转换变量为mean = 0和sd = 1)。如何在执行z归一化时排除列中的NA值

我用下面的公式(例如缩放年平均温度,“MAT”):

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

,但我得到NaN值,因为很少有数据缺失这个变量。如何在上述公式中排除MAT的NA值? PS:我试图在公式中包含na.rm=TRUE,但它不起作用。

一个更快的方式很可能使用dplyr作为显示here:但我得到了同样的问题

+0

你使用'na.rm = T'两个'mean'和'sd'电话?那么你应该只获得那些最初是NA的值的NAs,其他值应该正确缩放。 – juod

回答

0

一个快速的解决方案是使用is.na功能,以获得NA元素的索引,然后删除它们。命令如下:

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

0

scale将排除来港为你

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)应该做你所需要的。

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

相关问题