2016-09-27 17 views
0

各列からその平均を差し引いたデータを取得したいとします。 まず、私は、各列 の平均を数える私のデータをm行列から行ではなく列ごとにベクトルをマイナスする方法

  angel distance 
    [1,] 1.3  0.43 
    [2,] 4.0  0.84 
    [3,] 2.7  0.58 
    [4,] 2.2  0.58 
    [5,] 3.6  0.70 
    [6,] 4.9  1.00 
    [7,] 0.9  0.27 
    [8,] 1.1  0.29 
    [9,] 3.1  0.63 

> mean<-apply(m,2,FUN=mean) 

     angel distance 
    2.6444444 0.5911111 

> m-mean 
     angel distance 
1 -1.34444444 -0.16111111 
2 3.40888889 -1.80444444 
3 0.05555556 -0.01111111 
4 1.60888889 -2.06444444 
5 0.95555556 0.10888889 
6 4.30888889 -1.64444444 
7 -1.74444444 -0.32111111 
8 0.50888889 -2.35444444 
9 0.45555556 0.03888889 

だから、最終的な答えをカラムマイナス平均を通じて得たと呼ばれる怒鳴るがあります。 各行でマイナスにします。どのように私はこれを得ることができますか?

答えて

1

まず、colMeans(m)を使用して、行列mの列手段を取得します。その後、我々はsweepを使用します:2はマージンを指定

sweep(m, 2, colMeans(m)) 

(私たちは列ごとの操作をしたい、と2Dインデックスで、2番目のインデックスが列のためです)。既定では、sweepFUN = "-"を実行します。したがって、上では、列の平均を行列から減算しています。

sweep(m, 1, rowMeans(m)) 

あなたも、他の機能へFUN引数を設定することができます。

は、同様に、我々が行を減算したい場合は、すべての行から、私たちが使用できることを意味します。 sweepのもう1つの一般的な使用法は、列/行の再スケーリングのためのものです。詳細はHow to rescale my matrix by column or rowを参照してください。他の回答で述べた


機能scaleは列方向の操作のためにのみを使用しています。一般的な使用方法は、すべての行列の列を標準化することです。 scale = FALSEは、列のセンタリングのみを実行するように設定できます。これらの関数の詳細について

if (center) { 
      center <- colMeans(x, na.rm = TRUE) 
      x <- sweep(x, 2L, center, check.margin = FALSE) 
     } 

if (scale) { 
    scale <- apply(x, 2L, f) 
     x <- sweep(x, 2L, scale, "/", check.margin = FALSE) 
     } 

読む?sweep?scale?colMeans

scaleあなたはsweep.defaultのソースコードを検査することで確認することができsweepの単なるラッパー関数です。

+0

はどうもありがとうございました。それは私のための詳細を提供します。私はそれを感謝しています。ありがとうございました! – JackBoooooom

+0

既にダウンしています。遅く返事して申し訳ありません。 – JackBoooooom

0

あなたは(スケーリングせずZスコアの正規化)、このことによって、同じを取得することができます:

scale(df, scale=FALSE) 

    angel distance 
[1,] -1.34444444 -0.16111111 
[2,] 1.35555556 0.24888889 
[3,] 0.05555556 -0.01111111 
[4,] -0.44444444 -0.01111111 
[5,] 0.95555556 0.10888889 
[6,] 2.25555556 0.40888889 
[7,] -1.74444444 -0.32111111 
[8,] -1.54444444 -0.30111111 
[9,] 0.45555556 0.03888889 
+0

うわー、もっと便利です。ご協力いただきありがとうございます。 – JackBoooooom

関連する問題