【问题标题】:Matching matrix rows with list elements in R将矩阵行与R中的列表元素匹配
【发布时间】:2021-07-07 10:44:24
【问题描述】:

一个可重现的数据:

dat1 <- matrix(0, nrow = 9, ncol = 2)
dat1[,1] <- rep(1:3,3)
dat1[,2] <- c(1,1,1,2,2,2,3,3,3)

dat2 <- list()
dat2[[1]] <- matrix(c(1,2,1,3), nrow = 2, ncol = 2)
dat2[[2]] <- matrix(c(1,1,2,3,1,3), nrow = 3, ncol = 2 )

> dat1
      [,1] [,2]
 [1,]    1    1
 [2,]    2    1
 [3,]    3    1
 [4,]    1    2
 [5,]    2    2
 [6,]    3    2
 [7,]    1    3
 [8,]    2    3
 [9,]    3    3

> dat2
[[1]]
     [,1] [,2]
[1,]    1    1
[2,]    2    3

[[2]]
     [,1] [,2]
[1,]    1    3
[2,]    1    1
[3,]    2    3

我有一个矩阵 (dat1) 和一个列表 (dat2)。

dat1 的某些行与 dat2 的某些列表元素相同。我的目标是找出与 dat2 匹配的 dat1 的相应行号并将它们存储在一个列表中。输出示例:

> ex.result
[[1]]
     [,1]
[1,]    1
[2,]    8

[[2]]
     [,1]
[1,]    7
[2,]    1
[3,]    8

我正在寻找一种不使用耗时循环的快速方法。

【问题讨论】:

    标签: r list matrix conditional-statements apply


    【解决方案1】:

    稍微不同的方法:

    
    lapply( dat2, function(m) {
        apply( m, 1, function(r) 
            which( apply( sweep( dat1, 2, r, "=="  ), 1, all ) ) ) %>% as.matrix })
    
    

    输出:

    [[1]]
         [,1]
    [1,]    1
    [2,]    8
    
    [[2]]
         [,1]
    [1,]    7
    [2,]    1
    [3,]    8
    
    

    【讨论】:

    • 我喜欢这个解决方案,但问题是它不是通用的。 dat1 不仅限于 2 列,因此我不能动态使用它。
    【解决方案2】:

    与上述相同,使用Map() 和矢量回收:

    # Coercing to a data.frame to recycle the vector that is used to search: 
    setNames(
      Map(function(x, y){
        matrix(
          match(
            apply(y, 1, paste, collapse = ", "),
            x
          )
        )
      }, 
      data.frame(apply(dat1, 1, paste, collapse = ", ")),
      dat2), 
    seq_len(length(dat2)))
    

    【讨论】:

    • 这个做了它应该做的,但对我来说它看起来有点复杂。我会给自己多一点时间去理解。
    • 不用担心,它与其他解决方案基本相同。
    【解决方案3】:

    这是一个选项:

    lapply(dat2, function(mat) 
        apply(mat, 1, function(row) 
            match(toString(row), apply(dat1, 1, toString))))
    #[[1]]
    #[1] 1 8
    #
    #[[2]]
    #[1] 7 1 8
    

    这将返回带有整数向量的 list,而不是带有 array/matrix 条目的 list

    【讨论】:

    • 用数组/矩阵返回会不会很困难?就我的目的而言,我发现使用矢量输出有点困难。
    • @Rel_Ai 您可以随时使用as.matrix 来强制输出matrix。话虽如此,索引向量似乎比单列matrix 更自然(对我而言)。如果您的对象很小,那么我建议使用lists 和向量(而不是matrixarray 对象。但显然我不知道激发您的问题的大局,所以这只是我的主观看法。
    猜你喜欢
    • 2016-07-27
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多