r - 从具有不同日期的两个文件夹中读取所有 CSV 文件的最佳方法 (LOOP)
问题描述
是否有一种简单的方法或循环可以让我从不同日期的两个文件夹相同文件中读取所有 CSV?这些文件夹将具有来自不同日期的相同数据集。目标是能够从这些数据集创建查询,并能够识别随着时间的推移发生的问题。我想用旧/新等标识符重命名 CSV。
示例数据:FILEA.CSV FILEB.CSV FILEC.CSV
读入 R 的文件名:FILEA_old, FILEA_new, FILEB_old, FILEB_new, FILEC_old, FILEC_new
我很早就在编程这个过程中。我已经在这里遇到错误:
Date<-c("17JUL2021", "18AUG2021")
for (i in Date) {
files <- list.files(path = paste0("~datapath",Date,"//csv//", pattern = '.csv$', full.names = F))}
我需要循环帮助来根据文件是旧文件还是新文件重命名文件:
names <- str_replace(files,".csv","_old")
然后我将所有文件读入R:
for(i in names){
filepath <- file.path(paste(i,".csv",sep=""))
assign(i, read.csv(filepath))
}
解决方案
如果所有 csv 文件的格式相同(或相似),而不是assign
将每个 csv 文件转换为不同的对象,我建议将它们全部组合成一个对象,并将文件名作为标识符保留在单独的列中。
我们可以使用map()
作为for
循环的替代方案,它创建所有输出的列表,可以使用bind_rows
.
请注意我如何将所有文件的名称从管道传输list.files
到地图中,但如果您愿意,可以将其作为单独的files
对象保留。使用recursive = TRUE
meanlist.files
查看路径中的所有文件夹,并full.names = TRUE
返回每个文件的完整路径。
在此示例中,我有一个父文件夹csv files
,然后是 2 个子文件夹folder_1
和folder_2
,每个子文件夹都包含file_1.csv
,file_2.csv
和file_3.csv
。
# first we list all the files
list.files(path = 'csv files', full.names = TRUE, recursive = TRUE) %>%
# then we map() over this function, which reads a csv and then makes a column with the files name
map(function(x){
read_csv(x) %>%
mutate(
file = x
)
}
) %>%
# join all csvs together
bind_rows %>%
# and save it as 'my_data'
{. ->> my_data}
my_data
# A tibble: 18 x 2
data file
<dbl> <chr>
1 1 csv files/folder_1/file_1.csv
2 2 csv files/folder_1/file_1.csv
3 3 csv files/folder_1/file_1.csv
4 1 csv files/folder_1/file_2.csv
5 2 csv files/folder_1/file_2.csv
6 3 csv files/folder_1/file_2.csv
7 1 csv files/folder_1/file_3.csv
8 2 csv files/folder_1/file_3.csv
9 3 csv files/folder_1/file_3.csv
10 1 csv files/folder_2/file_1.csv
11 2 csv files/folder_2/file_1.csv
12 3 csv files/folder_2/file_1.csv
13 1 csv files/folder_2/file_2.csv
14 2 csv files/folder_2/file_2.csv
15 3 csv files/folder_2/file_2.csv
16 1 csv files/folder_2/file_3.csv
17 2 csv files/folder_2/file_3.csv
18 3 csv files/folder_2/file_3.csv
如果您想将文件的名称从 to 更改_new
为_old
或任何您喜欢的名称,我建议创建一个新列,并根据文件路径的名称填充它。在此示例中,我可以调用folder_1
“旧”文件中的所有文件。
my_data %>%
mutate(
age = ifelse(str_detect(file, 'folder_1'), 'old', 'new')
)
# A tibble: 18 x 3
data file age
<dbl> <chr> <chr>
1 1 csv files/folder_1/file_1.csv old
2 2 csv files/folder_1/file_1.csv old
3 3 csv files/folder_1/file_1.csv old
4 1 csv files/folder_1/file_2.csv old
5 2 csv files/folder_1/file_2.csv old
6 3 csv files/folder_1/file_2.csv old
7 1 csv files/folder_1/file_3.csv old
8 2 csv files/folder_1/file_3.csv old
9 3 csv files/folder_1/file_3.csv old
10 1 csv files/folder_2/file_1.csv new
11 2 csv files/folder_2/file_1.csv new
12 3 csv files/folder_2/file_1.csv new
13 1 csv files/folder_2/file_2.csv new
14 2 csv files/folder_2/file_2.csv new
15 3 csv files/folder_2/file_2.csv new
16 1 csv files/folder_2/file_3.csv new
17 2 csv files/folder_2/file_3.csv new
18 3 csv files/folder_2/file_3.csv new
我建议不要修改文件列,因为如果您需要检查原始 csv 文件,它可以方便地追溯问题和对数据进行故障排除。
推荐阅读
- java - 如何在数组中添加很多东西?
- javascript - 改组选项后的按钮
- oracle - 如何在 macOS Catalina 10.15 上安装 SQL Developer?
- python - 将 Python 中的三个列表与排序结合起来
- python - mysql.connector 的 Python 编码问题 - 获取数据
- python - 填充一个空矩阵并使用python中的行
- python - pandas 个性化 groupby 数据算术操作
- sql-server - 分区组的 SQL Server 滞后
- arrays - 使用 scala 将 JSON 对象字段添加到数据框中的 JSON 数组字段
- c# - Autofac 和 DI - 如何用 UnitOfWork 解决这个问题