4

考虑以下矩阵:

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

但这涉及到额外变量的使用,有没有更优雅的解决方案?

4

2 回答 2

12

因为scale除以方差,它必须这样做。

连续变量真的不应该有联系,更不用说零方差,也不适合缩放离散或分类变量。

于 2013-03-12T14:24:38.520 回答
7

您可以使用以下解决方法:

apply(x, 2, function(y) (y - mean(y)) / sd(y) ^ as.logical(sd(y)))

     [,1]       [,2]
[1,]    0 -0.7071068
[2,]    0  0.7071068
于 2013-03-12T14:42:38.317 回答