将深度嵌套的文件保存到具有特定文件名的特定目录
Saving deeply nested files to specific directories with specific filenames
给定一个 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,])))
(即:mylist00$cars$fast
,其中fast
是数据帧,cars
和1000
是mylist
中的嵌套列表)
我想将每个最里面的数据帧(即:fast
)保存为 .csv,并将 df 名称作为文件名,即:fast.csv
、并且 我希望文件保存在以第二级列表命名的目录中,即:~/1000/fast.csv
。
每个目录都已经存在,所以我不需要创建新的 1000
和 2000
目录。
我的直觉是做一个嵌套的 lapply
或 lapply
/mapply
组合...但是跟踪不同级别和它们的名称对我来说是一个挑战。我知道 purrr
有 iwalk
功能,但我不确定如何在深层嵌套列表中使用它。
我目前的尝试失败了。
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
...其中所有文件实际上只是一个 csv mylist00$cars$mild
假设子文件夹在工作目录中:
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)
})
给定一个 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,])))
(即:mylist00$cars$fast
,其中fast
是数据帧,cars
和1000
是mylist
中的嵌套列表)
我想将每个最里面的数据帧(即:fast
)保存为 .csv,并将 df 名称作为文件名,即:fast.csv
、并且 我希望文件保存在以第二级列表命名的目录中,即:~/1000/fast.csv
。
每个目录都已经存在,所以我不需要创建新的 1000
和 2000
目录。
我的直觉是做一个嵌套的 lapply
或 lapply
/mapply
组合...但是跟踪不同级别和它们的名称对我来说是一个挑战。我知道 purrr
有 iwalk
功能,但我不确定如何在深层嵌套列表中使用它。
我目前的尝试失败了。
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
...其中所有文件实际上只是一个 csv mylist00$cars$mild
假设子文件夹在工作目录中:
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)
})