将列表中的每个数据帧另存为CSV,并将文件名与df名称-R相同;拉普里

时间:2018-09-05 16:12:26

标签: r csv dataframe lapply

我有一个数据框列表。我想将每个数据框另存为单独的CSV文件,并使文件名与数据框的名称相同。

df <- list(mtcars, iris, ToothGrowth) df <- setNames(df, c("mtcars",
"iris", "ToothGrowth"))

lapply(df, function(a) write.csv(a, file = paste0("C:/home/",
unlist(lapply(names(df)), function (b) b)), ".csv"), row.names = FALSE))

给出错误:

  

文件错误(文件,ifelse(追加,“ a”,“ w”)):无效   'description'参数另外:警告消息:在if(file ==   “”)文件<-stdout()else if(is.character(file)){:

     

file(file,ifelse(append,“ a”,   “ w”)):无效的“描述”参数

我可以肯定问题出在第二个lapply命令中,但是我似乎无法弄清楚如何根据df名称“自动”分配文件名。任何帮助将不胜感激。

谢谢

2 个答案:

答案 0 :(得分:2)

如果要同时迭代名称和data.frame,最好使用mapply同时浏览两个列表

mapply(function(dname, data) 
   write.csv(data, file = paste0("C:/home/", dname, ".csv"), row.names = FALSE), 
   names(df), df)

当通过lapply()迭代列表时,当前值名称不可用。使用lapply的替代方法是迭代名称,而不是值

lapply(names(df), function(dname) 
   write.csv(df[[dname]], file = paste0("C:/home/", dname, ".csv"), row.names = FALSE))

答案 1 :(得分:1)

purrr具有以i开头的函数,这些函数使索引映射变得容易。由于您不需要返回任何内容,因此iwalk会很好地工作。给定一个命名列表,iwalk然后应用一个以列表项和列表项的名称为参数的函数,因此您不需要任何额外的步骤就可以像使用基本apply函数一样提取名称。我的文件路径有所不同,仅是因为我在Mac上-可以忽略它。

df <- list(mtcars, iris, ToothGrowth) 
df <- setNames(df, c("mtcars", "iris", "ToothGrowth"))

purrr::iwalk(df, function(dat, name) write.csv(dat, file = paste0("./", name, ".csv")))