如何抓取csvs文件夹的文件名的一部分并将该名称作为列插入R中的数据框中

时间:2018-09-11 13:45:58

标签: r read.csv

我有一个30个csv的文件夹,其名称为data-0601-0909 -daily_2018-06-24.csv,但这些csvs没有Date列。

我想编写一个循环,并将名称“ 2018-06-24”的最后一部分替换为文件的日期列。每个文件只有一个具有相同日期的日期列。

我试图使用下面的代码作为一个数据帧一次读取大量的csvs,但是卡住了按文件名分配新列。

 files = list.files(pattern="*.csv") 
 myfiles = do.call(rbind, lapply(files, function(x) read.csv(x, stringsAsFactors = FALSE)))

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

使用purr,readr和stringr和dplyr,您可以执行以下操作

library(purrr)
library(readr)
library(stringr)
library(dplyr)

files <- list.files(pattern = "\\.csv$")

map_dfr(files, function(filename) {
    read_csv(filename) %>%
      mutate(date = str_extract(filename, "[0-9]{4}-[0-9]{2}-[0-9]{2}(?=\\.csv$)"))
})

有关正则表达式,请参见:https://regex101.com/r/bJOmzn/1

答案 1 :(得分:0)

因此,我不能完全确定您的数据框中包含的数据是什么;但是我们可以使用lapply和自定义函数为每行分配一个日期(从文件名中获取),然后将它们一起绑定。

第1步:从工作目录获取文件

files <- list.files(pattern = '\\.csv')

第2步:自定义函数,该函数首先读取一个csv文件,然后从文件名中剥离最终元素,然后将其添加为另一列

files_with_date <- function(filename){
  a <- read.csv(filename, stringsAsFactors = FALSE)
  b <- substr(filename,(nchar(filename)+1)-14, nchar(filename)-4)
  cbind(a,b) 
}

第3步:将其包装在rbind的do.call中,然后在其中将函数应用到我们的列表中

myfiles <- do.call(rbind, lapply(files, files_with_date))

substr函数有点黑。...