为所有嵌套索引嵌套列表中的某些元素

Indexing certain elements in a nested list, for all nests

我有一个包含更多列表列表的列表:

results <- sapply(c(paste0("cv_", seq(1:50)), "errors"), function(x) NULL)

## Locations for results to be stored
step_results <- sapply(c("myFit", "forecast", "errors"), function(x) NULL)
step_errors <- sapply(c("MAE", "MSE", "sign_accuracy"), function(x) NULL)
final_error <- sapply(c("MAE", "MSE", "sign_accuracy"), function(x) NULL)

for(i in 1:50){results[[i]] <- step_results}
for(i in 1:50){results[[i]][[3]] <- step_errors}
results$errors <- final_error

现在在整个结构中,我想总结 sign_accuracy 中的所有值并将它们保存在 results$errors$sign_accuracy

我也许可以用 for 循环来做到这一点,用 i:

建立索引
## This is just an example - it won't actually work!
sign_acc <- matrix(nrow = 50, ncol = 2)
for (i in 1:50){
     sign_acc[i, ] <- `results[[i]][[3]][[3]]`
     results$errors$sign_accuracy <- sign_acc
}

如果我没记错的话,在Matlab中有类似list(:)的东西,表示所有元素。 In Python我见过类似list(0:-1)的,也就是所有元素的意思。

什么是优雅的 R 等价物?我不太喜欢循环。

我看过 methods using the apply 函数族。使用 apply(data, "[[", 2) 之类的东西,但无法使其适用于更深的列表。

你试过 c(..., recursive) 了吗?

这里有一个选项,最后有一个简短的例子:

sumList <- function(l, label) {
    lc <- c(l, recursive=T)
    filter <- grepl(paste0("\.",label, "$"), names(lc)) | (names(lc) == label)
    nums <- lc[filter]
    return(sum(as.numeric(nums)))
}

ex <- list(a=56,b=list("5",a=34,list(c="3",a="5")))
sumList(ex,"a")

在这种情况下,你可以做你想做的

results$errors$sign_accuracy <- do.call(sum, lapply(results, function(x){x[[3]][[3]]}))

lapply循环遍历results的第一层,为每个拉出第三个元素的第三个元素。 do.call(sum 捕获所有结果并对它们求和。

当嵌套更不规则时,或者当您需要遍历多个索引时,列表就会出现真正的问题。它总是可以用同样的方式完成,但它很快就会变得非常丑陋。