将不同文件夹中的同名 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 文件。在论坛上,我发现了一个问题,解决的是比较类似的问题,只是将所有数据合并到一个文件中,没有细分成单独的文件。

问题可以分为几个部分:

  1. 使用 list.files(..., recursive = TRUE).
  2. 识别工作目录所有子文件夹中的所有文件
  3. 只保留 csv 文件
  4. 将它们全部导入 r - 例如,通过 mapping read.csv 到所有路径
  5. 将所有内容合并到一个数据框中,例如 reducebind_rows(假设所有 csvs 具有相同的结构)
  6. 根据站点代码拆分单个数据帧,例如 group_split()
  7. 将这些拆分数据帧写入 csv,例如通过 mapping 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)
})