あなたが説明した線に沿ったいくつかの例のデータを考える
set.seed(1)
d <- data.frame(C1 = LETTERS[1:4], C2 = letters[1:4],
C3 = runif(4, min = 0, max = 10),
C4 = runif(4, min = 0, max = 10))
d
次に、説明した正規化を行う簡単な関数を作成できます
normalise <- function(x, na.rm = TRUE) {
ranx <- range(x, na.rm = na.rm)
(x - ranx[1]) / diff(ranx)
}
これはさまざまな方法でデータに適用できますが、ここでは次を使用しますapply()
。
apply(d[, 3:4], 2, normalise)
を与える
R> apply(d[, 3:4], 2, normalise)
C3 C4
[1,] 0.0000000 0.0000000
[2,] 0.1658867 0.9377039
[3,] 0.4782093 1.0000000
[4,] 1.0000000 0.6179273
これらを既存のデータに追加するには、次のようにします。
d2 <- data.frame(d, apply(d[, 3:4], 2, normalise))
d2
これにより、次のことが得られます。
R> d2
C1 C2 C3 C4 C3.1 C4.1
1 A a 2.655087 2.016819 0.0000000 0.0000000
2 B b 3.721239 8.983897 0.1658867 0.9377039
3 C c 5.728534 9.446753 0.4782093 1.0000000
4 D d 9.082078 6.607978 1.0000000 0.6179273
今、あなたのデータには含まれていると言いましたが、NA
それを処理する必要があります。na.rm
関数で引数をTRUE
に設定したことに気付いたかもしれませんnormalise()
。これは、次の存在下でも機能することを意味しますNA
。
d3 <- d
d3[c(1,3), c(3,4)] <- NA ## set some NA
d3
R> d3
C1 C2 C3 C4
1 A a NA NA
2 B b 3.721239 8.983897
3 C c NA NA
4 D d 9.082078 6.607978
非データnormalise()
のみを使用して、まだ有用な出力が得られます。NA
R> apply(d3[, 3:4], 2, normalise)
C3 C4
[1,] NA NA
[2,] 0 1
[3,] NA NA
[4,] 1 0
これを書面normalise()
で行わなかった場合、出力は次のようになります (はおよび他の同様の関数na.rm = FALSE
のデフォルトです!)range()
R> apply(d3[, 3:4], 2, normalise, na.rm = FALSE)
C3 C4
[1,] NA NA
[2,] NA NA
[3,] NA NA
[4,] NA NA