2016-06-29 11 views
1

私は、ベクトルに与えられた値と一致する行列の列のインデックスを返す高速な方法を探しています(理想的には長さ1または私はrowMatches()を返す呼び出し行列の列インデックスを返すRの値に一致する

mat <- matrix(1:100,10) 
values <- c(11,2,23,12,35,6,97,3,9,10) 

所望の機能、:行列の行)例えば

実際
rowMatches(mat, values) 
[1] 2 1 3 NA 4 1 10 NA 1 1 

、値11は、まず、第1行の第2列に見出されます、値2は第2行の第1列に現れ、値23i 3行目の3列目の値は12で、4行目の値は12ではありません。

は、私は、パッケージmatrixStatsのいずれかの解決策を見つけていないので、私はこの機能を思い付いた:

rowMatches <- function(mat,values) {    
    res <- integer(nrow(mat)) 
    matches <- mat == values 
    for (col in ncol(mat):1) { 
     res[matches[,col]] <- col 
    } 
    res[res==0] <- NA 
    res 
} 

を私の意図した用途のために、行といくつかの列の数百万人が存在します。行列を行(例えば、rowsと呼ばれるリスト)に分割し、Map(match, as.list(values), rows)を呼び出すのは遅すぎるでしょう。
しかし、多くの列があると遅くなるかもしれないループがあるので、私の関数では満足できません。列にapply()を使用することは可能ですが、速度が向上しません。

アイデア?

+1

がmax.col' 'を参照してください - あなたは' max.col使用することができます( "第1"、試合を) '' rowSums(matches)== 0L'のどこにでも 'NA'を使用してください –

+0

素晴らしい!私は 'max.col()'について知らなかった。あなたはこのソリューションを投稿することができ、私はそれを検証します。 (mtotoの場合、結果に適切なインデックスに「NA」があります) – jeanlain

答えて

0
res <- arrayInd(match(values, mat), .dim = dim(mat)) 
res[res[, 1] != seq_len(nrow(res)), 2] <- NA 
#  [,1] [,2] 
# [1,] 1 2 
# [2,] 2 1 
# [3,] 3 3 
# [4,] 2 NA 
# [5,] 5 4 
# [6,] 6 1 
# [7,] 7 10 
# [8,] 3 NA 
# [9,] 9 1 
#[10,] 10 1 
0

ローランドの答えは良いですが、私は代替ソリューション投稿します:?

res <- which(mat==values, arr.ind = T) 
res <- res[match(seq_len(nrow(mat)), res[,1]), 2] 
関連する問題