2017-04-21 10 views
1

行列Aの「パーセンタイル」バージョンを作成しようとしています
最初に、各列のパーセンタイルカットオフを計算します
次に、行列Aの各列について、等しい長さのベクトルと新しいベクトル1から10までの値を持つ必要があります。最初のデシールに値が1の場合など
最終出力は行列Aと同じ次元を持つ行列Bで、Bの値は1から10までです。
サンプル行列Aは、私はループのために使用されてきた
Rの行列の連続データの "カテゴリバージョン"を列方向に作成するスマートな方法?

set.seed(1) 
matrix(rnorm(5 * 5000, 1, 0.5), ncol = 5, nrow = 5000) 

あります各列が、これを行うにはスマートな方法が必要があると感じる..任意のヒント&トリックが評価されています。ありがとう!

+0

この例では実際に5000行が必要ですか?確かに一握りはやるだろう。 – thelatemail

+0

私の頭痛のマトリックスはもっと100K +行に似ているので、元のポストに5000を入れてその風味を見せます。ご意見ありがとうございます。 – HueSX

答えて

2

このようにします。

m = matrix(rnorm(5 * 10, 1, 0.5), ncol = 5, nrow = 10) 
apply(X = m, MARGIN = 2, function(a) 
    findInterval(x = a, left.open = FALSE, rightmost.closed = TRUE, 
          vec = quantile(x = a, probs = 0:10/10))) 
     [,1] [,2] [,3] [,4] [,5] 
[1,] 3 10 10 10 4 
[2,] 5 5 9 4 3 
[3,] 1 2 6 7 8 
[4,] 10 1 1 6 7 
[5,] 6 9 8 1 2 
[6,] 2 3 5 2 1 
[7,] 7 4 4 3 6 
[8,] 9 8 2 5 9 
[9,] 8 7 3 9 5 
[10,] 4 6 7 8 10 
+1

クイック眼球でよく見えます。 cut()も別のオプションかもしれません。 – thelatemail

+1

ありがとうございます!はい、私は出てきて、時間のニックネームでcut()を見つけました。今、スパゲッティコードはもっと良くなり、 "カットオフ"マトリックスと行列Bを出力できます。 @db:apply() !私はこれを解決するためにどのように使用するのだろうと思っていたが、その機能を理解できなかった。 – HueSX

関連する問題