如何在R中合并多个.csv文件,并为每个数据集的名称添加一列?

时间:2019-05-06 22:03:43

标签: r

我正在尝试在R中合并多个CSV文件,以便可以进行一些预测建模。虽然每个文件具有相同的列,并且这些列的相同顺序是相同的,但某些列的名称不同。到目前为止,我的代码很好地合并了文件并剥离了标头。但是,现在我需要做的是为与每个CSV相关的日期添加另外两列。每个CSV文件的文件名都包含日期。

文件名的格式如下:“ 2017年1月”,“ 2017年2月”,“ 2017年3月”等。

所以我希望这两列分别是月份和年份。

下面是我到目前为止使用的代码。它将所有CSV合并为一个,但没有创建我需要的另外两列。

dat <- setwd('C:/Users/ . . . /Historical Data')

file_names <- dir(dat)
dataset <- do.call(rbind, lapply(file_names, read.csv, skip = 1, header = FALSE))
dataset <- do.call(rbind, lapply(file_names, read.csv, header = FALSE, function(x) cbind(read.csv(x), name=strsplit(x,'\\.')[[1]][1])))

head(dataset)

任何人都可以为我指出正确的方向,以便将这两列最佳地编码为其中吗?

2 个答案:

答案 0 :(得分:2)

您的代码一开始就很好。

以下代码读取file_list中的每个元素,并将其附加到一个空列表中。然后将所有元素绑定在一起。批量读取文件并将文件名保留在单独的列中非常有用。

尝试这样做:

library(data.table)
file_list <- list()
file_list <- lapply(file_names, function(x){
                    ret <- read_csv(x)
                    ret$origin <- x
                    return(ret)})
df <- rbindlist(file_list)

答案 1 :(得分:1)

这是一种library(tidyverse)来完成您需要的方式,您仍然可以将工作目录设置为需要的位置,并且可以使用dir()来代替list.files()

dat_files <- list.files(".../Historical Data", pattern='*.csv')

map_df(dat_files, ~read_csv(.x) %>%
                 mutate(month_year = str_remove_all(.x, ".csv", "")) %>%
                 separate(month_year, into=c("Month", "Year"), sep=" ")
)

此代码会将您的所有文件读入一个df文件,并使用文件名创建一个未附加.csv的新列。然后,它将在" "

上将该列分隔为“月份和年份”列