使用一个列表中的向量作为另一个列表中向量的索引

4
我有两个列表,每个列表都包含相同数量的向量。List1 包含长度相同的向量,而 List2 包含可能长度不同的向量。思路是,使用 List2 中向量的内容作为对应 List1 中向量的索引。以下是可复制示例的一些代码:
# create empty lists
List1 <- list()
List2 <- list()


# fill the lists with vectors
set.seed(50)
for (i in 1:1000) {
  List1[[i]] <- sample(0:500, 360, replace= T)
}

set.seed(100)
for (i in 1:1000) {
  List2[[i]] <- sample(0:200, 50, replace= T)
}

这里是一个提取每个列表中向量的示例:

vec1 <- List1[[1]]
vec2 <- List2[[1]]

# now use the second vector as index for the first one
vec1[vec2]

现在的问题是如何将这个过程应用到整个列表,以便输出仍然是一个包含结果向量的列表?
有任何想法吗?
编辑: 这是在一些非常有帮助的答案后的编辑,列表的结构已经更新,但问题仍然存在。
以下是可重现示例的代码:
# create empty lists
List1 <- list()
List2 <- list()


# fill the lists with vectors
set.seed(50)
for (i in 1:1000) {
  List1[[i]] <- sample(0:500, 360, replace= T)
}

set.seed(100)
for (i in 1:1000) {
  List2[[i]] <- sample(0:200, 50, replace= T)
}

# create the first level sublists
sublist1 <- list()
sublist2 <- list()
for (i in 1:8) {
  sublist1[[i]] <- List1
  sublist2[[i]] <- List2
}

# create the super lists
superlist1 <- list(sublist1, sublist1, sublist1, sublist1, sublist1, sublist1, sublist1, sublist1)
superlist2 <- list(sublist2, sublist2, sublist2, sublist2, sublist2, sublist2, sublist2, sublist2)

从这里可以看出,这两个超级列表具有相同的结构,它们只在最低层次的列表长度上有所不同。

那么现在的问题是,如何使用 superlist2[[1]][[1]][[1]] 的值作为相应元素的向量,用于 superlist1 中的 superlist1[[1]][[1]][[1]] 等等?

3个回答

6
你需要一个"应用函数(apply-function)":
lapply(seq_along(List1), function(n) List1[[n]][List2[[n]]])

返回预期的列表。

使用 tidyverse,你可以使用以下代码:

library(dplyr)
library(purrr)

List1 %>% 
  map2(.y = List2, ~.x[.y])

获得相同的结果。


谢谢Martin Gal,这个完美地解决了我的问题!实际上,我的两个列表都是更大的列表的子列表。您知道如何嵌套命令吗?当相关列表在第三层时(即列表的列表的列表)? - climsaver
这取决于您的列表的实际结构。您有例子吗? - Martin Gal
Martin Gal,抱歉回复晚了,我在度假。我已经编辑了上面的问题,这样你就可以重现我的列表结构了。 - climsaver
我现在正在休假。也许创建一个新问题会更好吧? - Martin Gal

4

我们可以在基础 R中使用Map

Map(`[`, List1, List2)

3
这是我的第一个循环,所以这只是尝试,请多多关照:
# loop
for (i in 1:length(List1)) {
    print(List1[[i]][List2[[i]]])
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接