2014-03-24 133 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