2017-02-25 18 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

相關問題