我有两个变量,一个是矩阵列表,另一个是矢量列表。
人:load("https://dl.dropboxusercontent.com/u/22681355/a.Rdata")
mat:load("https://dl.dropboxusercontent.com/u/22681355/b.Rdata")
我想沿着[[1]]
中的元素从[[99]]
转到people
并选择mat
中mat
的第一列匹配的行people
并返回mat
的第二列。
我试过了:
lapply(seq_along(people), function(i) mat[mat[,1,i] ==
people[i], 2, i])
然而,这无法处理有时只有1个匹配条目的事实,而在其他情况下可能有2个或3个匹配条目。
有人可以帮忙修改我的代码吗?
小例子:
人:
[[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 :(得分:0)
我不确定这是否会拉出你想要的东西。从你的评论我匹配人[1]与mat [,, 1]的元素,人[2]与mat [,, 2]等等,并返回mat的第二列中的值,如果有匹配
我已经使用了人们的前3个值并使用了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