[英]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)))
這是我失敗的嘗試之一:
#循環遍歷嵌套列表
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]]))
}
}
很高興獲得幫助/指導。
這個解決方案如何在x
的每個元素上並行調用lapply()
,並將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
如果您想在特定條件下過濾每個子列表,您可以在每次並行迭代中應用function_of_interest()
Filter()
的調用。 在此示例中,我們將僅將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] 105
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.