我有两个列表,每个列表都包含相同数量的向量。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)
}
Run Code Online (Sandbox Code Playgroud)
这是我希望从每个列表中提取向量的示例:
vec1 <- List1[[1]]
vec2 <- List2[[1]]
# now use the second vector as index for the first one
vec1[vec2]
Run Code Online (Sandbox Code Playgroud)
现在的问题是,如何将其传输到整个列表,以便输出再次成为包含结果向量的列表?
有人有想法吗?
编辑: 这是在一些非常有用的答案之后使用新的列表结构进行的编辑,问题保持不变。
这是可重现示例的代码:
# 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)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,两个超级列表具有相同的结构,它们只是最低级别列表的长度不同。
那么现在的问题是,如何将 的值用作superlist2[[1]][[1]][[1]]中相应元素的向量superlist1,即superlist1[[1]][[1]][[1]]等等?
你需要一个apply- 函数:
lapply(seq_along(List1), function(n) List1[[n]][List2[[n]]])
Run Code Online (Sandbox Code Playgroud)
返回预期列表。
与tidyverse你可以使用
library(dplyr)
library(purrr)
List1 %>%
map2(.y = List2, ~.x[.y])
Run Code Online (Sandbox Code Playgroud)
得到相同的结果。
| 归档时间: |
|
| 查看次数: |
172 次 |
| 最近记录: |