如何根据 R 中的原始文件名将包含多个数据帧的大列表保存为单个 csv

Posted

技术标签:

【中文标题】如何根据 R 中的原始文件名将包含多个数据帧的大列表保存为单个 csv【英文标题】:How to save a large list containing multiple dataframes as individual csvs based on original file names in R 【发布时间】:2021-12-30 00:38:21 【问题描述】:

我已从文件夹中读取文件列表:

files <- list.files("E:new data/Depth and Temp")
allFiles.list <- lapply(files, read.table, sep = '\t')

然后将一组函数应用于已读取的文件,这些文件工作正常:

load_file <- function(files) 
  tab_file <- read.table(files, header = TRUE)
  tab_file$Date.Time <- as_datetime(tab_file$Time)
  tab_file$Date.Time <- tab_file$Date.Time + hours(9)
  setnames(tab_file, old = c('External.Temperature','Corrected.Depth.Channel'), new = c('Temp','Depth'))
  
  tab_file


list_of_files = list.files(pattern="*.tab")

data <- lapply(X = list_of_files, FUN = load_file)

我现在有一个包含单个文件作为 R 中数据框的大列表:

但我很难将它们保存为新文件。我希望新文件与以前的文件同名,但另存为 csv。

例如当前名称:

144881.tab
144883_2.tab
156889.tab
156889_2.tab

我希望它们保存为:

144881.csv
144883_2.csv
156889.csv
156889_2.csv

我认为这会相对简单(我确信确实如此),但经过几个小时的互联网搜索后,我仍然无法找到我要查找的内容。

注意:我只提供了我的数据的一个小屏幕截图(带有 2 个示例),但我在这个文件夹中有超过 25 个文件,所以我希望使用以前的文件名以避免手动重新输入它们。提前谢谢!

【问题讨论】:

【参考方案1】:

你可以试试:

   filenames <- list.files(pattern="*.tab")
    file_prefix <- filenames |> stringr::str_extract("[:graph:]1,1000(?=\\.)")
    names(data) <- file_prefix
    file_prefix |> purrr::map(~write.csv(x = data[[.x]], file = paste0(.x, ".csv")))

如果您有旧版本的 R,您可以使用 magrittrs %&gt;% 而不是 |&gt;

【讨论】:

您好,有一个小警告:打印出文件名为 2 而不是 144883_2 的下划线 2 (144883_2.tab) 的文件。任何想法如何解决这个问题? 嗨,我修正了我的答案:stringr::str_extract(...) 只查找字符和数字,而不是特殊字符。 太棒了!工作完美。谢谢你:)

以上是关于如何根据 R 中的原始文件名将包含多个数据帧的大列表保存为单个 csv的主要内容,如果未能解决你的问题,请参考以下文章

根据文件名将目录中的多个 .xlsx 文件读取到单独的 Pandas 数据框中

批处理文件根据文件名将文件复制到多个文件夹

bat批处理,根据清单中的文件名将多个文件移动到另外一个路径下,如何批量处理?非常感谢!

根据文件名将 Google Cloud 存储桶中的多个文件复制到不同的目录

如何根据一个数据帧中的列值和R中另一个数据帧的列标题名称有条件地创建新列

R:从一个数据帧中提取行,基于列名匹配来自另一个数据帧的值