scale関数を使う。ただし、このscale関数では標準化への変換の際に、分散ではなく不偏分散(偏差平方和を「標本数-1」で割った値)を使うことに注意。
以下は、ベクトルでデータを与えた例。
> scale(c(1, 4, 9, 16,25))
[,1]
[1,] -1.0341754
[2,] -0.7239228
[3,] -0.2068351
[4,] 0.5170877
[5,] 1.4478455
attr(,"scaled:center")
[1] 11
attr(,"scaled:scale")
[1] 9.66954
引数に行列を与えると、列ごとにデータの標準化を行う。
> mx <- matrix((1:20) ^ 2, 5, 4)
> mx
[,1] [,2] [,3] [,4]
[1,] 1 36 121 256
[2,] 4 49 144 289
[3,] 9 64 169 324
[4,] 16 81 196 361
[5,] 25 100 225 400
> scale(mx)
[,1] [,2] [,3] [,4]
[1,] -1.0341754 -1.18262479 -1.21500315 -1.22911095
[2,] -0.7239228 -0.67015405 -0.65610170 -0.64967293
[3,] -0.2068351 -0.07884165 -0.04860013 -0.03511746
[4,] 0.5170877 0.59131240 0.60750157 0.61455548
[5,] 1.4478455 1.34030810 1.31220340 1.29934586
attr(,"scaled:center")
[1] 11 66 171 326
attr(,"scaled:scale")
[1] 9.66954 25.36730 41.15216 56.95173
不偏分散ではなく分散(偏差平方和を標本数で割った値)によるデータの標準化には、関数を自作する必要がある。以下は、標準偏差(偏差平方和を標本数で割った値の平方根)を求める自作関数stdと、分散によるデータの標準化を行う自作関数scaを使った例。
> std <- function(d) sqrt(sum((d - mean(d)) ^ 2) / length(d))
> sca <- function(d) (d - mean(d)) / std(d)
> sca(c(1, 4, 9, 16, 25))
[1] -1.1562432 -0.8093703 -0.2312486 0.5781216 1.6187405
> apply(mx, MARGIN = 2, sca)
[,1] [,2] [,3] [,4]
[1,] -1.1562432 -1.32221471 -1.35841482 -1.37418782
[2,] -0.8093703 -0.74925500 -0.73354400 -0.72635642
[3,] -0.2312486 -0.08814765 -0.05433659 -0.03926251
[4,] 0.5781216 0.66110736 0.67920741 0.68709391
[5,] 1.6187405 1.49851001 1.46708800 1.45271284