【问题标题】:Saving deeply nested files to specific directories with specific filenames将深度嵌套的文件保存到具有特定文件名的特定目录
【发布时间】:2019-03-20 01:16:22
【问题描述】:

给定一个 3 级嵌套列表:

mylist <- list("1000"=list("cars"=list("fast"=mtcars[1:10,], "slow"=mtcars[11:15,]), "flower"=iris), "2000"=list("tooth"=ToothGrowth, "air"=airquality, "cars"=list("cruiser"=mtcars[5:12,], "fast"=mtcars[1:3,], "mild"=mtcars[9:18,]))) 

(即:mylist$1000$cars$fast,其中fast 是一个数据框,cars1000mylist 中的嵌套列表)

我想将每个最里面的数据框(即:fast)保存为 .csv,并将 df 名称作为文件名,即:fast.csv我想要文件要保存在以第二级列表命名的目录中,即:~/1000/fast.csv

每个目录都已经存在,所以我不需要创建新的10002000 目录。

我的直觉是做一个嵌套的lapplylapply/mapply 组合......但是跟踪不同的级别和他们的名字对我来说是一个挑战。我知道purrriwalk 函数,但我不确定如何在深度嵌套列表中使用它。

我当前的尝试失败了。

lapply(mylist, function(d){
  lapply(names(mylist), function(id){
    lapply(names(d$cars), function(s){
    lapply(d$cars, function(a){
        write.csv(a, paste0(outdir, id, "/", s, ".csv"))})})})})

输出结果是单个文件以多个名称保存到所有目录中。即:~/1000/cruiser.csv~/1000/fast.csv~/1000/mild.csv~/2000/cruiser.csv~/2000/fast.csv~/2000/mild.csv ...其中所有文件实际上只是mylist$2000$cars$mild的一个csv

【问题讨论】:

    标签: r lapply purrr mapply


    【解决方案1】:

    假设子文件夹在工作目录中:

    purrr::iwalk(mylist, function(el, folder){
      purrr::walk(el,
                  function(sub_el, folder){
                    if(class(sub_el) == "list"){
                      purrr::iwalk(sub_el,
                                   function(dat, dat_name, folder){
                                     write.csv(dat,
                                               # below line specifies file path of new file
                                               paste0(folder, "/", dat_name, ".csv"))
                                   },
                                   folder = folder)
                    }
                  },
                  folder = folder)
    })
    

    【讨论】:

    • 太棒了。我将不得不更多地研究咕噜声。如果文件不在工作目录中(除了设置新的工作目录),还有什么修改?
    • 如果您要写入的文件夹不在工作目录中 - 您需要将第二个参数更改为 write.csv(在我的情况下为 paste0 行)。
    • 试过了;说我的路径在outdirpaste0(outdir, folder, "/", dat_name, ".csv") 创建正确的文件以及一个附加文件 1000.csv
    • hmm...如果它在工作目录之外,您必须指定一个绝对文件路径。如果您已经这样做了,请确保您使用/ 来分隔outdirfolder?当我写信到外部文件夹时,我无法重现这种行为(对我来说没问题)。
    • 是的,这是绝对路径问题。固定为:paste0("~/", outdir, folder, "/", dat_name, ".csv")。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多