提问人:ramen 提问时间:7/5/2022 更新时间:7/14/2022 访问量:372
遍历嵌套列表 [R] 的某些元素
Iterating through certain elements of nested list [R]
问:
我有一个很大的嵌套列表。它的结构类似于提供的虚拟数据。我想循环浏览此列表,并仅将某个函数应用于名为“seq”的元素(向量),而忽略其他类别。感兴趣的元素应受制于另一个函数 - 下面伪代码中的“function_of_interest”,输出应附加到新列表中。由于我的数据量很大,我想并行进行。
这是虚拟输入:
x <- list(one = list(one_1 = list(seq = 1:9, start = 1, end = 5),
one_2 = list(seq = 2:11, start = 2, end = 6), one_3 = list(
seq = 3:12, start = 3, end = 7)), two = list(two_1 = list(
seq = 1:13, start = 8, end = 222), two_2 = list(seq = 1:14,
start = 13, end = 54)))
这是我失败的一次尝试:
#loop 嵌套列表
for (gene in seq_along(genes_list)){
for (segment in seq_along(genes_list[[gene]])){
output_list <- c(output_list, foreach::foreach(segment) %dopar% function_of_interest(genes_list[[gene]][[segment]]))
}
}
很乐意提供帮助/指导。
答:
2赞
qdread
7/5/2022
#1
这个解决方案如何调用并行的每个元素,并应用于称为 的第二级嵌套列表的每个元素。注意:这要求每个列表实际上都有一个名为 的元素。您需要添加其他代码来测试每个列表是否都是这种情况,如果其中一些列表可能没有名为 的元素。lapply()
x
function_of_interest()
seq
seq
seq
我定义了一个来测试你的代码。function_of_interest()
function_of_interest <- function(vec) sum(vec)
output_list <- foreach(i = seq_along(x)) %dopar% {
lapply(x[[i]], function(x_ij) function_of_interest(x_ij[['seq']]))
}
输出:
[[1]]
[[1]]$one_1
[1] 45
[[1]]$one_2
[1] 65
[[1]]$one_3
[1] 75
[[2]]
[[2]]$two_1
[1] 91
[[2]]$two_2
[1] 105
附录:过滤每个子列表
如果要根据特定条件筛选每个子列表,则可以在每次并行迭代中应用之前添加调用。在此示例中,我们将仅应用于包含名为 的元素中的值的子列表。Filter()
function_of_interest()
function_of_interest()
1
seq
output_list <- foreach(i = seq_along(x)) %dopar% {
x_i_filtered <- Filter(function(x_i) 1 %in% x_i[['seq']], x[[i]])
lapply(x_i_filtered, function(x_ij) function_of_interest(x_ij[['seq']]))
}
输出:
[[1]]
[[1]]$one_1
[1] 45
[[2]]
[[2]]$two_1
[1] 91
[[2]]$two_2
[1] 105
评论
0赞
ramen
7/13/2022
感谢您的解决方案。如果function_of_interest包含更高级的选项,例如基于起始值的过滤,该怎么办?这是我正在努力正确应用的东西。
0赞
qdread
7/13/2022
你能更具体地说明你需要什么吗?我根据你提出的问题,尽我所能回答了你的问题。您可能需要提出一个新问题。
0赞
ramen
7/14/2022
我很欣赏你的回答。但是,如果您不介意,我想跟进此线程以避免类似的问题成倍增加。因此,例如,如果我想更改function_of_interest,它将仅过滤那些包含 1 的子列表,而其余的将被省略(one_2 和 one_3,因为它们在变量“seq”中没有 1。我尝试使用 Filter() 无济于事。我应该为此发布另一个问题吗?
1赞
qdread
7/14/2022
我在答案中添加了更多文本以解决其他问题。将来,您可以随时继续在初始问题中提出问题的两个部分。
评论