【发布时间】:2016-10-31 22:51:49
【问题描述】:
我正在寻找一种快速方法来返回与向量中提供的值匹配的矩阵列的索引(理想情况下长度为 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(),但它不会让它更快。
有什么想法吗?
【问题讨论】:
-
见
?max.col——你可以使用max.col(matches, "first")和NA在任何地方rowSums(matches) == 0L -
太棒了!我不知道
max.col()。您可以发布此解决方案,我将对其进行验证。 (对于 mtoto,在结果中的相应索引处有一个NA)