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
撰文者: |
*1:t(x) - y)/(z - y