我有一个大的嵌套列表。它的结构类似于提供的虚拟数据。我想循环这个列表,只对名为"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)))以下是我失败的一次尝试:
#循环嵌套列表
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]]))
}
}很乐意得到帮助/指导。
发布于 2022-07-05 12:58:03
这个解决方案并行地调用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()应用于在名为seq的元素中包含值1的子列表。
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] 105https://stackoverflow.com/questions/72869656
复制相似问题