提问人:jeanlain 提问时间:6/29/2016 更新时间:6/29/2016 访问量:2342
返回与 R 中的值匹配的矩阵列索引
returning matrix column indices matching value(s) in R
问:
我正在寻找一种快速的方法来返回矩阵中与向量中提供的值匹配的列索引(理想情况下长度为 1 或与矩阵中的行数相同) 例如:
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 出现在第 2 行的第 1 列,值 23 出现在第 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()
有什么想法吗?
答:
2赞
Roland
6/29/2016
#1
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
1赞
jeanlain
6/29/2016
#2
Roland 的回答很好,但我会发布一个替代解决方案:
res <- which(mat==values, arr.ind = T)
res <- res[match(seq_len(nrow(mat)), res[,1]), 2]
评论
?max.col
max.col(matches, "first")
NA
rowSums(matches) == 0L
max.col()
NA