2

2列の行列の最小値と最大値を使用して値を正規化するためのRコードを見つけようとしています。

私のマトリックスは次のようになります。列1(C1)とC2 IDは計算されません、C3。見出し行1、次に407の番号とNA、C4;見出し行1、次に番号とNA。

私は次のようなことを考えていました:

C3の最小値=x、同じ列xの最大値、

If(x="","NA",(x-Min value)/(Max value-Min value))

これにより、0から1までの値を持つ列が得られます。列4についても同じことを行う必要があります(これはyでしょうか、それともRで混乱しますか?)

私はこのコードを生成するのに十分なプログラミングやRのスキルがありません。このための特定のコードはありますか、それとも誰かが私がコードを書くのを手伝ってくれますか?

4

2 に答える 2

4

あなたが説明した線に沿ったいくつかの例のデータを考える

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
于 2012-10-19T09:04:42.977 に答える
0

これは一種のノンパラメトリック正規化ですが、別の方法を使用することをお勧めします。中央値と四分位範囲を計算し、中央値を引き、IQR で割ります。これにより、中央値が 0 で IQR が 1 の分布が得られます。

m <- median( df$C3, na.rm = T )
iqr <- IQR( df$C3, na.rm = T )
df$C3 <- ( df$C3 - m ) / iqr

あなたが提案する方法は、外れ値に対して非常に敏感です。本当にやりたい場合は、次の方法があります。

 rng <- range( df$C3, na.rm = T )
 df$C3 <- ( df$C3 - rng[1] ) / ( rng[2] - rng[1] )
于 2012-10-19T07:58:17.683 に答える