2016-06-29 67 views
1

我正在尋找一種快速的方式來返回矩陣的列的索引匹配向量中提供的值(理想的長度爲1或相同的數量矩陣中的行) 例如:返回矩陣列索引匹配值在R

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

所期望的功能,我稱之爲rowMatches()將返回:

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

實際上,值11被首次發現在第一行的第二列中,值2出現在第2行的第1列,值23 i s在第3行的第3列,值12不在第4行......依此類推。

因爲我沒有找到包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(火柴, 「第一」) '並且在'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]