【问题标题】:in R, how to make each dataframe generated in foreach loops available in global environment在 R 中,如何使在 foreach 循环中生成的每个数据帧在全局环境中可用
【发布时间】:2019-07-09 21:52:29
【问题描述】:

在 R 中,如何使 foreach 循环中生成的每个数据帧在全局环境中作为单独的数据帧可用

我只能将它们保存到一个列表 (x) 中,但该列表有 3 层;有超过 40,000 个数据帧,解包非常耗时。

x <- foreach(q=1:countq, .export = ls(globalenv())) %do% {
        foreach(p=1:countp, .export = ls(globalenv())) %do% {
          foreach(o=1:countero, .export = ls(globalenv())) %dopar% {
            n<-rbind(df_o, df_p, df_q)
          }
        }

如果从这个嵌套的 foreach 循环中获得数据帧 n1、n2、n3、...直到 n40000,那就太好了。

【问题讨论】:

  • 您不会尝试从另一个 R 会话访问一个 R 会话环境中的变量。虽然我理解处理多层列表的困难,但我建议您的问题应该与foreach 和所有关于“嵌套列表”的问题有关。也许如果您提供一个示例(可能是 2-3 个简单的三重嵌套列表),我们可以帮助您进行所需的聚合和/或提取。 (为此,我们还需要知道您需要从他们那里得到什么,即预期输出。)
  • 对于一个好的数据样本,我建议使用dput 的输出,可能类似于mt &lt;- mtcars[1:2,]; dput(replicate(3, replicate(2, replicate(2, mt, simplify=F), simplify=F), simplify=FALSE))。只是一个想法,关键是dput(head(x)) 其中x 是您的嵌套列表。

标签: r foreach global environment


【解决方案1】:

一旦将 data.frames 列表的列表转换为单个 data.frame(例如,data.table::rbindlist),您的数据应该易于使用。

library(doParallel)
registerDoParallel( cores = 2 )
countq <- countp <- countero <- 30
d <- mtcars
x <- 
foreach(q=1:countq) %do% {
    foreach(p=1:countp) %do% {
        foreach(o=1:countero) %dopar% {
            data.frame( q=q, p=p, o=o, d )
        }
    }
}
x <- lapply( x, function(u) lapply(u, data.table::rbindlist) )
x <- lapply( x, data.table::rbindlist )
x <- data.table::rbindlist(x)
x <- as.data.frame(x)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    相关资源
    最近更新 更多