2016-06-29 64 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]