将不同文件夹中的同名 CSV 文件合并为一个文件
Merging CSV files of the same names from different folders into one file
我有 14 年的不同气象站(超过 400 个)的降水数据,结构如下 2008-2021 年:
/2008/Meteo_2008-01/249180090.csv
/2008/Meteo_2008-02/249180090.csv
/2008/Meteo_2008-03/249180090.csv ... 其余月份依此类推。
/2009/Meteo_2009-01/249180090.csv
/2009/Meteo_2009-02/249180090.csv
/2009/Meteo_2009-03/249180090.csv ... 其余月份依此类推。
到 2021 年我都有这样的结构。249180090.csv - 代表车站代码,正如我上面写的那样,我有 400 多个车站。
在 CSV 文件中,有所需降雨站的每日降水量数据。
我想为从 2088 年到 2021 年的每一年的每个站创建一个 CSV 文件,其中将包含从 1 月到 12 月关于降水的合并信息。 CSV文件名需包含站号。
有人会好心帮助我如何在循环中做到这一点吗?我的目标不是只从所有数据中创建一个文件,而是为每个气象站创建一个单独的 CSV 文件。在论坛上,我发现了一个问题,解决的是比较类似的问题,只是将所有数据合并到一个文件中,没有细分成单独的文件。
问题可以分为几个部分:
- 使用
list.files(..., recursive = TRUE)
. 识别工作目录所有子文件夹中的所有文件
- 只保留 csv 文件
- 将它们全部导入 r - 例如,通过
map
ping read.csv
到所有路径
- 将所有内容合并到一个数据框中,例如
reduce
和 bind_rows
(假设所有 csvs 具有相同的结构)
- 根据站点代码拆分单个数据帧,例如
group_split()
- 将这些拆分数据帧写入 csv,例如通过
map
ping write.csv
.
这样可以避免使用 for 循环。
library(here)
library(stringr)
library(purrr)
library(dplyr)
# Identify all files
filenames <- list.files(here(), recursive = TRUE, full.names = TRUE)
# Limit to csv files
joined <- filenames[str_detect(filenames, ".csv")] |>
# Read them all in
map(read.csv) |>
# Join them in
reduce(bind_rows)
# Split into one dataframe per station
split_df <- joined |> group_split(station_code)
# Save each dataframe to a separate csv
map(seq_along(split_df), function(i) {
write.csv(split_df[[i]],
paste0(split_df[[i]][1,1], "_combined.csv"),
row.names = FALSE)
})
我有 14 年的不同气象站(超过 400 个)的降水数据,结构如下 2008-2021 年:
/2008/Meteo_2008-01/249180090.csv
/2008/Meteo_2008-02/249180090.csv
/2008/Meteo_2008-03/249180090.csv ... 其余月份依此类推。
/2009/Meteo_2009-01/249180090.csv
/2009/Meteo_2009-02/249180090.csv
/2009/Meteo_2009-03/249180090.csv ... 其余月份依此类推。
到 2021 年我都有这样的结构。249180090.csv - 代表车站代码,正如我上面写的那样,我有 400 多个车站。
在 CSV 文件中,有所需降雨站的每日降水量数据。
我想为从 2088 年到 2021 年的每一年的每个站创建一个 CSV 文件,其中将包含从 1 月到 12 月关于降水的合并信息。 CSV文件名需包含站号。
有人会好心帮助我如何在循环中做到这一点吗?我的目标不是只从所有数据中创建一个文件,而是为每个气象站创建一个单独的 CSV 文件。在论坛上,我发现了一个问题,解决的是比较类似的问题,只是将所有数据合并到一个文件中,没有细分成单独的文件。
问题可以分为几个部分:
- 使用
list.files(..., recursive = TRUE)
. 识别工作目录所有子文件夹中的所有文件
- 只保留 csv 文件
- 将它们全部导入 r - 例如,通过
map
pingread.csv
到所有路径 - 将所有内容合并到一个数据框中,例如
reduce
和bind_rows
(假设所有 csvs 具有相同的结构) - 根据站点代码拆分单个数据帧,例如
group_split()
- 将这些拆分数据帧写入 csv,例如通过
map
pingwrite.csv
.
这样可以避免使用 for 循环。
library(here)
library(stringr)
library(purrr)
library(dplyr)
# Identify all files
filenames <- list.files(here(), recursive = TRUE, full.names = TRUE)
# Limit to csv files
joined <- filenames[str_detect(filenames, ".csv")] |>
# Read them all in
map(read.csv) |>
# Join them in
reduce(bind_rows)
# Split into one dataframe per station
split_df <- joined |> group_split(station_code)
# Save each dataframe to a separate csv
map(seq_along(split_df), function(i) {
write.csv(split_df[[i]],
paste0(split_df[[i]][1,1], "_combined.csv"),
row.names = FALSE)
})