6

次のコードを使用して、0 から 1 の範囲で data.frame をスケーリングしようとしています。

for(i in 1:nrow(data))
{
  x <- data[i, ]
  data[i, ] <- scale(x, min(x), max(x)-min(x))
}

Data:
 x1   x2  x3  x4  x5  x6  x7  x8  x9  x10  x11  x12  x13  x14  x15  x16  x17 
 15   6   6   0   9   3   1   4   5    1    1   13    0    0   20    5   28
 2  24  14   7   0  15   7   0  11   3    3    4   15    7    0   30    0  344
 3  10   5   2   0   6   2   0   5   0    0    2    7    1    0   11    0  399
 4   9   4   2   0   5   2   0   4   0    0    2    6    1    0   10    0   28
 5   6   2   1   0   3   1   0   2   0    0    1    3    1    0    6    0   82
 6   9   4   2   0   5   2   0   4   0    0    2    6    1    0   10    0   42

しかし、次のエラー メッセージが表示されます。

Error in scale.default(x, min(x), max(x) - min(x)) (from #4) : 
  length of 'center' must equal the number of columns of 'x'
4

3 に答える 3

8

このデータを使用すると、あなたの例は私にとってうまくいきます:

data <- matrix(sample(1:1000,17*6), ncol=17,nrow=6)
for(i in 1:nrow(data)){
  x <- data[i, ]
  data[i, ] <- scale(x, min(x), max(x)-min(x))
}

ここでは、ループなしで scale を使用する別のオプションを示します。scaleaと acenterにマトリックスと同じ列を指定するだけです。

maxs <- apply(data, 2, max)    
mins <- apply(data, 2, min)
scale(data, center = mins, scale = maxs - mins)

結果にアクセスする方法を編集します。

スケールは、2 つの属性を持つマトリックスを返します。data.frame を取得するには、スケール結果を data.frame に強制するだけです。

dat.scale <- scale(data, center = mins, scale = maxs - mins)
dat.sacle <- as.data.frame(dat.scale)
于 2013-03-29T07:06:09.913 に答える
4

centerとのscale引数scaleは、 の列数と同じ長さでなければなりませんxdataのように見えるdata.frameので、あなたxと同じ数の列がdata.frameあるため、競合が発生します。この問題を解決するには、次の 3 つの方法があります。

  • に渡す前に、行をアトミック ベクトルにドロップしますscale(単一の列として扱います)。scale(as.numeric(x), ...)
  • に変換dataします。これによりmatrix、行の抽出がアトミック ベクトルに自動的にドロップされます。
  • @agstudyの提案を使用しapplyてください.data.framematrix
于 2013-03-29T07:15:11.420 に答える