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

时间:2016-01-14 03:18:47

标签: r list indexing nested-lists lapply

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

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)的内容,但不能让它适用于更深层列表。

2 个答案:

答案 0 :(得分:3)

您是否尝试使用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")

答案 1 :(得分:1)

在这种情况下,你可以用

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

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

当嵌套更不规则,或者需要循环遍历多个索引时,会出现列表的实际问题。它总是可以以相同的方式完成,但它会很快变得非常难看。