【问题标题】:returning matrix column indices matching value(s) in R返回矩阵列索引匹配 R 中的值
【发布时间】: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

标签: r matrix match


【解决方案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

【讨论】:

    【解决方案2】:

    Roland 的回答很好,但我会发布一个替代解决方案:

    res <- which(mat==values, arr.ind = T)
    res <- res[match(seq_len(nrow(mat)), res[,1]), 2]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-21
      • 2018-08-29
      • 2010-12-22
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      相关资源
      最近更新 更多