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

4
我正在尝试在R中组合多个CSV文件,以便进行一些预测建模。虽然每个文件具有相同的列且这些列的顺序相同,但某些列的名称不同。迄今为止,我的代码将文件组合得很好并剥离了标题。然而,我现在需要它添加另外两列来标识每个CSV文件的日期。每个CSV的文件名包含日期。
文件名格式如下:'January 2017','February 2017','March 2017',等等。
所以我希望这两列分别表示月份和年份。
以下是我到目前为止使用的代码。它将所有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个回答

3

你的代码一开始就很好。

以下代码读取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
这里是使用 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=" ")
)

这段代码将读取所有文件并将它们合并成一个数据框。使用文件名创建新列,但不包括 .csv 后缀。然后,以 " " 为分隔符,将该列分成月份和年份两列。

谢谢!看起来我收到了一个错误,但我无法弄清楚为什么...在语法中没有任何额外的括号:错误:意外符号: “mutate(month_year = str_remove_all(.x, ".csv", "")) 分离"
) 错误:意外的 ')' 在 ")"
需要注意的是,我对R相对较新,如果这是一个愚蠢的问题,请见谅!
- Mike
@Mike 哦,我在 mutate() 后面漏掉了一个 %>%。我已经编辑了我的答案,现在包括它了。 - dylanjm
谢谢!由于某种原因,代码似乎只在两列中创建了24行,除非我做错了什么(很可能)。我需要它将两列与组合数据集并排放置。这可行吗?换句话说,我的文件夹中的所有文件都将合并为一个数据集,并剥离标题。然后,将添加两列,其中包含每个CSV关联的月份和日期,以及每行来自哪个CSV。 - Mike
所以你需要12行12列或类似的东西吗?你应该编辑你的问题并提供期望的输出。 - dylanjm
明白了。我已经学习编程几个月了,对StackOverflow也不太熟悉,如果我表达不清楚请见谅!每个CSV文件包含几百行数据。因此,这将是一个包含大约10,000行数据的组合数据集,并且每一行都会有与该行相关联的月份和年份(来自CSV文件名)。我想下次我会记住这点的。感谢您的所有帮助 :) - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接