我有一个包含更多列表列表的列表:
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)
的内容,但不能让它适用于更深层列表。
答案 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
抓住所有结果并总结它们。
当嵌套更不规则,或者需要循环遍历多个索引时,会出现列表的实际问题。它总是可以以相同的方式完成,但它会很快变得非常难看。