【问题标题】:Read csv files to separate dataframes based on a grouping variable读取 csv 文件以根据分组变量分隔数据帧
【发布时间】:2017-05-11 19:50:03
【问题描述】:

给定 20k 个 csv 文件,以及定义 csv 文件包含的数据组和 csv 文件的文件名的 tibble:

df <- tibble(
  group = c("group_1", "group_1", "group_2", "group_3"), 
  file_name = c("file_1.csv", "file_2.csv", "file_3.csv", "file_4.csv")
)

我需要导入 csv 文件并 rbind 到数据帧,但每个组需要一个单独的数据帧

这些文件可能没有相同的列,因此如果您只是导入所有文件并在第 1 步绑定,那么稍后会删除一些列。所以理想情况下,我需要一个从组开始,读取相关文件,绑定行,然后输出为与组命名相同的数据帧的过程。

我可以使用 lapply、read.csv 和 bind_rows 导入 csv 文件,但我似乎无法根据有多少组来概括该过程。

最好使用基于 lapply 或 purrr 的解决方案。

干杯

【问题讨论】:

  • 发出咕噜声,可能类似于df %&gt;% split(.$group) %&gt;% map(~map_df(.x$file_name, read.csv, .id = 'group'))
  • 也许更整洁,嵌套而不是分裂:library(tidyverse); df %&gt;% group_by(group) %&gt;% summarise(file_name = list(file_name)) %&gt;% mutate(data = map(file_name, ~map_df(.x, read_csv, .id = 'file')))

标签: r lapply purrr


【解决方案1】:

试试:

dff <- tibble(
  group = c("group_1", "group_1", "group_2", "group_3"), 
  file_name = c("file_1.csv", "file_2.csv", "file_3.csv", "file_4.csv")
)

lapply(split(dff, dff$group), function(x) {
    do.call(rbind, lapply(x$file_name, read.csv))
})

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多