R軟體再談行導向

進行資料分析前,資料正規化經常是一個必要的步驟。此時若能留意R 的行導向特性,當可事半功倍。例如:欲對下列三行變數做最大-最小正規化

> (x <- matrix(1:24,8,3))

       [,1]  [,2]  [,3]

[1,]    1    9    17

[2,]    2   10   18

[3,]    3   11   19

[4,]    4   12   20

[5,]    5   13   21

[6,]    6   14   22

[7,]    7   15   23

[8,]    8   16   24

首先以先前提過的apply 函數求出各行最小值,

> (y <- apply(x, 2, min))

[1]  1  9 17

再求出各行最大值,

> (z <- apply(x, 2, max))
[1] 8 16 24

y 與z 看起來像是列向量,實際上它們是行向量!因此x 須先轉置(transpose),才能將各行剪去其最小值。

>  t(x) - y

     [ ,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]

[1,]    0    1     2     3    4     5     6    7

[2,]    0    1     2     3    4     5     6    7

[3,]    0    1     2     3    4     5     6    7

讀者可試著輸入x 未轉置的指令,結果是x 減去[1 9 17 1 9 17 1 9]T,因為y 的長度不及8,所以R 會將較短向量y 中元素自動重複,直到其長度為8 為止。

> x - y
       [,1]   [,2]   [,3]

[1,]     0    -8      8

[2,]    -7     9      1

[3,]  -14     2     18

[4,]     3    -5     11

[5,]    -4    12      4

[6,]  -11     5      21

[7,]    6     -2     14

[8,]   -1    15       7

我們所要的正規化結果是將(t(x) - y)再除以各行最大值與最小值的差(z - y),

> (t(x) - y)/(z - y)

        [,1]           [,2]             [,3]             [,4]             [,5]            [,6]             [,7]  [,8] 

[1,]     0  0.1428571  0.2857143  0.4285714  0.5714286  0.7142857  0.8571429    1

[2,]     0  0.1428571  0.2857143  0.4285714  0.5714286  0.7142857  0.8571429    1

[3,]     0  0.1428571  0.2857143  0.4285714  0.5714286  0.7142857  0.8571429    1

再將它轉置就回到原始資料8 列3 行的形式了!

> t*1

                [,1]            [,2]             [,3]

[1,] 0.0000000  0.0000000  0.0000000

[2,] 0.1428571  0.1428571  0.1428571

[3,] 0.2857143  0.2857143  0.2857143

[4,] 0.4285714  0.4285714  0.4285714

[5,] 0.5714286  0.5714286  0.5714286

[6,] 0.7142857  0.7142857  0.7142857

[7,] 0.8571429  0.8571429  0.8571429

[8,] 1.0000000  1.0000000  1.0000000

 

撰文者:
鄒慶士 博士
現任:
北商資訊與決策科學所教授
中華 R 軟體學會理事長
信箱:
vince.tsou@gmail.com

*1:t(x) - y)/(z - y