【发布时间】:2016-07-27 09:03:14
【问题描述】:
“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行的非零数是1,它位于行的第三位,可以匹配矩阵“b”的1-5行,第2行为1,位于本行首位,可匹配矩阵“b”的3-5行,第3行非零数为1,位于第2位这一行,它可以匹配矩阵“b”的3-4行。所以只有矩阵“b”的第3或第4行可以匹配这个对象中的所有行,所以输出结果是“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
没错。但我想知道是否有更快速的代码来处理这个问题?
【问题讨论】:
-
其实元素[3,4]不匹配...
-
@SerbanTanasa 为什么?它是匹配的。 “a”的第一个对象中的所有非零元素都匹配矩阵“b”第二行的对应位置,“a”的第二个对象中的所有非零元素都匹配矩阵“b”的第5行的对应位置矩阵“b”,并且“a”的第三个对象中的所有非零元素都与矩阵“b”第6行的对应位置匹配。
-
你的实际数据有哪些维度?
-
@alexis_laz "a" 有 300 个对象(每个对象是一个矩阵(圆形 20X5)),"b" 是一个 15 行矩阵。
-
如果在同一列中有两个非零数字会发生什么,比如
a[[1]]?