将列表与R中的矩阵行匹配

光钉

“ a”是列表,“ b”是矩阵。

a<-list(matrix(c(0,2,0,1,0,2,0,0,1,0,0,0,0,0,2,2),4), 
        matrix(c(0,1,0,0,0,1,1,0,0,0,0,0),3),
        matrix(c(0,0,0,0,2,0,1,0,0,0,0,0,2,0,2,1,0,1,1,0),5))
b<-matrix(c(2,2,1,1,1,2,1,2,1,1,2,1,1,1,1,1,1,2,2,2,1,2,1,1),6) 

> a
[[1]]
     [,1] [,2] [,3] [,4]
[1,]    0    0    1    0
[2,]    2    2    0    0
[3,]    0    0    0    2
[4,]    1    0    0    2

[[2]]
     [,1] [,2] [,3] [,4]
[1,]    0    0    1    0
[2,]    1    0    0    0
[3,]    0    1    0    0

[[3]]
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    1
[2,]    0    1    0    0
[3,]    0    0    2    1
[4,]    0    0    0    1
[5,]    2    0    2    0

> b
     [,1] [,2] [,3] [,4]
[1,]    2    1    1    2
[2,]    2    2    1    2
[3,]    1    1    1    1
[4,]    1    1    1    2
[5,]    1    2    1    1
[6,]    2    1    2    1

列表“ a”中有3个对象。我想测试列表“ a”中每个对象中的所有非零元素是否与矩阵“ b”中同一行的对应位置匹配。如果匹配,则输出匹配的行号b。

例如,第二个对象是

[[2]]
     [,1] [,2] [,3] [,4]
[1,]    0    0    1    0
[2,]    1    0    0    0
[3,]    0    1    0    0

我们可以看到第一行中的非零数字是1,它位于行的第三位,它可以匹配矩阵“ b”的1-5行,第二行中的非零数字是1,位于该行的第一位,它可以匹配3-5行的矩阵“ b”,第三行的非零数字为1,位于该行的第二位,它可以匹配矩阵“ b”的3-4行。因此,只有矩阵“ b”的第三行或第四行可以匹配该对象中的所有行,因此输出结果为“ 3 4”。

我的尝试代码如下:

temp<-Map(function(y) t(y), Map(function(a) 
           apply(a,1,function(x){
                 apply(b,1, function(y) identical(x[x!=0],y[x!=0]))}),a))
lapply(temp, function(a) which(apply(a,2,prod)==1))

结果如下:

[[1]]
integer(0)

[[2]]
[1] 3 4

[[3]]
[1] 6

这是正确的。但是我想知道是否有更快速的代码来处理这个问题?

亚历克西斯·拉兹

有几列,并尝试利用具有> 1个唯一值或没有非零值的列来减少计算:

ff = function(a, b)
{
    i = seq_len(nrow(b))  #starting candidate matches
    for(j in seq_len(ncol(a))) {
        aj = a[, j]
        nzaj = aj[aj != 0L]
        if(!length(nzaj)) next  #if all(a[, j] == 0) save some operations
        if(sum(tabulate(nzaj) > 0L) > 1L) return(integer())  #if no unique values in a column break looping 
        i = i[b[i, j] == nzaj[[1L]]]  #update candidate matches
    }

    return(i)
}
lapply(a, function(x) ff(x, b))
#[[1]]
#integer(0)
#
#[[2]]
#[1] 3 4
#
#[[3]]
#[1] 6

使用您实际大小的数据:

set.seed(911)
a2 = replicate(300L, matrix(sample(0:3, 20 * 5, TRUE, c(0.97, 0.01, 0.01, 0.01)), 20, 5), simplify = FALSE)
b2 = matrix(sample(1:3, 15 * 5, TRUE), 15, 5)
identical(OP(a2, b2), lapply(a2, function(x) ff(x, b2)))
#[1] TRUE
microbenchmark::microbenchmark(OP(a2, b2), lapply(a2, function(x) ff(x, b2)), times = 50)
#Unit: milliseconds
#                              expr        min         lq       mean     median         uq       max neval cld
#                        OP(a2, b2) 686.961815 730.840732 760.029859 753.790094 785.310056 863.04577    50   b
# lapply(a2, function(x) ff(x, b2))   8.110542   8.450888   9.381802   8.949924   9.872826  15.51568    50  a

OP 是:

OP = function (a, b) 
{
    temp = Map(function(y) t(y), Map(function(a) apply(a, 1, 
        function(x) {
            apply(b, 1, function(y) identical(x[x != 0], y[x != 
                0]))
        }), a))
    lapply(temp, function(x) which(apply(x, 2, prod) == 1))
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将矩阵与矩阵行中的元素匹配

来自分类Dev

从R列表中的矩阵中提取行

来自分类Dev

在 R 中,矩阵的子集行以获取列表

来自分类Dev

通过匹配R中的名称在矩阵中插入向量列表

来自分类Dev

将稀疏矩阵索引列表转换为R中的矩阵

来自分类Dev

从R中的矩阵中删除行名列表

来自分类Dev

交错存储在R中的列表中的矩阵行

来自分类Dev

交错存储在R中的列表中的矩阵行

来自分类Dev

将函数应用于R中的列表矩阵

来自分类Dev

将矩阵转换为R中的特定列表

来自分类Dev

将“大列表”的每个元素转换为R中的矩阵

来自分类Dev

将邻接矩阵转换为 R 中的两列表

来自分类Dev

如何有效地将矩阵的每一行与R中列表的每个部分进行比较?

来自分类Dev

R通过将列名匹配到字符串列表来对矩阵列重新排序

来自分类Dev

R中的矩阵处理列表

来自分类Dev

将函数应用于R中矩阵的行

来自分类Dev

r将每个矩阵行与列中的元素相乘

来自分类Dev

将行名称设置为R中的多个矩阵

来自分类Dev

将矩阵循环到R中的矩阵

来自分类Dev

如何按行名合并矩阵,并在R中的不匹配元素中插入空白?

来自分类Dev

将矩阵转换为R中的累积行平均值矩阵

来自分类Dev

将矩阵转换为R中的累积行平均值矩阵

来自分类Dev

我如何将数据帧列表转换为R中的矩阵列表?

来自分类Dev

从列表中删除 scipy 矩阵中的行

来自分类Dev

R将矩阵转换为列表

来自分类Dev

R-如何从距离矩阵中获取匹配元素的行和列下标

来自分类Dev

R:将矩阵转换为子矩阵列表

来自分类Dev

删除R中矩阵中的“”,以便处理列表中包含非空元素的行

来自分类Dev

将列表转换为python中的矩阵

Related 相关文章

热门标签

归档