遍历嵌套列表 [R] 的某些元素

Iterating through certain elements of nested list [R]

提问人:ramen 提问时间:7/5/2022 更新时间:7/14/2022 访问量:372

问:

我有一个很大的嵌套列表。它的结构类似于提供的虚拟数据。我想循环浏览此列表,并仅将某个函数应用于名为“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]]))
    }
  }

很乐意提供帮助/指导。

r for-loop 嵌套循环 嵌套列表

评论


答:

2赞 qdread 7/5/2022 #1

这个解决方案如何调用并行的每个元素,并应用于称为 的第二级嵌套列表的每个元素。注意:这要求每个列表实际上都有一个名为 的元素。您需要添加其他代码来测试每个列表是否都是这种情况,如果其中一些列表可能没有名为 的元素。lapply()xfunction_of_interest()seqseqseq

我定义了一个来测试你的代码。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()1seq

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
我在答案中添加了更多文本以解决其他问题。将来,您可以随时继续在初始问题中提出问题的两个部分。