2014-03-24 82 views
0

我有两个变量,一个是矩阵列表,另一个是矢量列表。从矩阵列表中选择与列表中的元素匹配的多个元素

人:load("https://dl.dropboxusercontent.com/u/22681355/a.Rdata")

垫:load("https://dl.dropboxusercontent.com/u/22681355/b.Rdata")

我想从[[1]][[99]]沿元素peoplemat选择行,其中的mat比赛people第一列返回第二列的mat

我想:

lapply(seq_along(people), function(i) mat[mat[,1,i] == 
    people[i], 2, i]) 

然而,这不能处理的事实,有时只有1匹配项,而在其他情况下,可以有2名或三个匹配的条目。

有人可以帮助修改我的代码吗?

小例子:

人:

[[1]] 
[1] 34 56 7 
[[2]] 
[1] 13 93 
[[3]] 
[1] 42 

,,1 
    [,1] [,2] [,3] 
[1,] 34 **2** 1 
[2,] 56 **2** 1 
[3,] 7 **2** 2 

,,2 
    [,1] [,2] [,3] 
[1,] 9 2 1 
[2,] 13 **2** 1 
[3,] 71 2 2 

,,3 
    [,1] [,2] [,3] 
[1,] 90 2 1 
[2,] 1 2 1 
[3,] 42 **2** 2 

输出将是:

+0

我无法使用您的链接访问您的数据 – user20650

+0

请输入您的数据的一个_small_样本。 – Henrik

+0

@ user20650你的意思是你不能在R中打开它,或者链接被破坏了?链接在这里工作。 – user1723765

回答

0

我不知道这是否是拉出你想要什么。从你的评论我匹配人[1]与mat [,, 1],人[2]与mat [,, 2]等元素,并返回值的第二列垫如果有一个匹配。

我已经使用了您的人和垫子Rdata中的前三个值。

# Reduce problem 
# mat <- mat[,,1:3] 
#people <- people[1:3] 

# Data 
mat <- structure(c(82, 59, 6, 1, 1, 2, 1, 1, 2, 17, 51, 18, 1, 2, 1, 
       1, 2, 1, 31, 26, 40, 1, 1, 1, 1, 1, 1), .Dim = c(3L, 3L, 3L)) 

people <- list(6, 51, c(31, 26, 40)) 


l <- lapply(seq(people), function(x) { 
      lapply(people[x] , function(z) { 
        mat[,,x][,2][match(z, mat[,,x][,1])] 
     })}) 


#-------------------------------------------------------------------- 

# output 
R> mat 
, , 1 

    [,1] [,2] [,3] 
[1,] 82 1 1 
[2,] 59 1 1 
[3,] 6 2 2 

, , 2 

    [,1] [,2] [,3] 
[1,] 17 1 1 
[2,] 51 2 2 
[3,] 18 1 1 

, , 3 

    [,1] [,2] [,3] 
[1,] 31 1 1 
[2,] 26 1 1 
[3,] 40 1 1 

R> people 
[[1]] 
[1] 6 

[[2]] 
[1] 51 

[[3]] 
[1] 31 26 40 

R> l 
[[1]] 
[[1]][[1]] 
[1] 2 


[[2]] 
[[2]][[1]] 
[1] 2 


[[3]] 
[[3]][[1]] 
[1] 1 1 1