我有两个这样的列表:
List1 <- list(c("toto", "titi"), c("tata"), c("toto", "tz", "tutu"))
List2 <- list(c("titi", "toto", "tutu"),
c("tata", "trtr", "to", "tututu"),
c("to", "titi", "tutu", "tyty"),
c("titi", "tu", "tyty", "tete"),
c("tktk", "ta"))
我想构建一个(匹配的)列表,它具有与List1
对象类似的结构,除了字符向量被{{的第一级元素的匹配索引列表替换。 1}},这是每个字符向量的每个字符串。
我将通过List2
和list1
示例获得的匹配列表是:
list2
我使用循环构建了以下代码解决方案(可行,但速度太慢)
Matchings <- list(list(list(1), list(1,3,4)),
list(list(2)),
list(list(1), list(), list(1,3)))
......但对于大型名单来说,它确实太慢了。因此,我寻求一种解决方案,尽可能使这些东西没有循环。
你能帮帮我吗?
答案 0 :(得分:2)
这个怎么样:
inds <- rep(seq_along(List2), sapply(List2, length))
#[1] 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5
ls <- unlist(List2)
res <-
relist(sapply(unlist(List1), function(a) as.list(inds[which(ls %in% a)])), skeleton=List1)
all.equal(Matchings, res)
#[1] TRUE
这将提供您想要的输出。我怀疑它至少可以循环List1
。