考虑以下矩阵:
x <- matrix(c(1,1,1,3),2)
x
[,1] [,2]
[1,] 1 1
[2,] 1 3
使用此方法调用scale
时,会为第一列返回NaN
值,其中方差为零:
scale(x)
[,1] [,2]
[1,] NaN -0.7071068
[2,] NaN 0.7071068
attr(,"scaled:center")
[1] 1 2
attr(,"scaled:scale")
[1] 0.000000 1.414214
但是,我希望它会返回0
。这是一个错误,还是我误解了这是什么,应该返回?
我想要的是:
y <- scale(x)
y[is.nan(y)] <- 0
但这涉及到使用额外的变量,是否有更优雅的解决方案?
答案 0 :(得分:10)
因为scale
除以方差,所以必须这样做。
连续变量确实不具有联系,更不用说零差异,并且不适合扩展离散或分类变量。
答案 1 :(得分:5)
您可以使用以下解决方法:
apply(x, 2, function(y) (y - mean(y)) / sd(y) ^ as.logical(sd(y)))
[,1] [,2]
[1,] 0 -0.7071068
[2,] 0 0.7071068