我需要对我的数据进行z标准化(即将变量转换为平均值= 0和sd = 1)。
我使用以下公式(例如缩放平均年温度," MAT"):
sca$MAT <- (sca$MAT - mean(sca$MAT)) / sd(sca$MAT)
但是我得到了NaN值,因为这个变量缺少很少的数据。如何在上述公式中排除MAT的NA值?
PS:我尝试在公式中加入na.rm=TRUE
,但它不起作用。
如here所示,更快的方法可能会使用dplyr
:但我遇到同样的问题
答案 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