我有一个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)))
任何帮助将不胜感激!
答案 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函数有点黑。...