2016-04-03 13 views
1

数値を持つ行列nxnを持っています。私は、各行ごとに最高の値を持つ3つの列と、それ以外の列にあるinpoutのゼロを見つける必要があります。R行列:最小値を持つ列にゼロを入力します。

例えば、行になり:

  a b r t  y n 
user1 1.3 2 4 5.5 0 0 
user2  8 0 1.5 5  3 7.2 

得られた行列は次のようになります。

  a b r t  y n 
user1  0 2 4 5.5 0 0 
user2  8 0 0 5  0 7.2 

答えて

4

我々(MARGIN=1有する)applyを用いmatrixの行をループ、rank要素論理ベクトル(< 4)を作成し、最高の3でない要素を置換するためにifelseを使用し、出力を転置します(t)。

m2 <- m1 
m2[] <-t(apply(m1, 1, function(x) 
     ifelse(rank(-x, ties.method='min') < 4, x, 0))) 
m2 
#  a b r t y n 
#user1 0 2 4 5.5 0 0.0 
#user2 8 0 0 5.0 0 7.2 

それとも別のオプション効率の問題場合

library(dplyr) 
m1[ave(m1, row(m1), FUN=min_rank) < 4] <- 0 
4

ですが、私はネクタイが問題ならば、ties.method引数を使用

matrixStatsパッケージ

m[matrixStats::rowRanks(m) < 4] <- 0 
m 
#  a b r t y n 
# user1 0 2 4 5.5 0 0.0 
# user2 8 0 0 5.0 0 7.2 

をしようとするだろう

関連する問題