【问题标题】:How to do same function on every file in a folder in R?如何对R中文件夹中的每个文件执行相同的功能?
【发布时间】:2020-08-11 20:47:43
【问题描述】:

所以我有一个格式相同的 csv 文件夹。让我们将文件夹称为“文件夹”和 csv:

  • test1.csv
  • test2.csv
  • test3.csv
  • ......

每个csv的格式如下

ID   date        hours  info
001  01/01/2019  8      xxxx
002  01/01/2019  22     xxxx
003  01/02/2019  4      xxxx
004  01/02/2019  5      xxxx

因此,如果我想要一个工作,但我如何在文件夹中的所有文件中运行和合并?

totals <- df %>%
            group_by(date) %>%
            summarize(hour_sum = sum(hours)

所以基本上我想要一个数据框,其中包含所有文件中的每个日期以及所有文件中的小时总和。

因此,如果01/02/2019 出现在 3 个文件中,我希望在一个 df 中每次出现该日期的小时数。

【问题讨论】:

    标签: r loops dplyr


    【解决方案1】:

    如果您愿意使用整个 tidyverse 包集,purrr 会为您提供 map_dfr,它通过 rbinding 您读入的每个数据集返回单个数据帧。有关它的更多信息 here

    代码如下所示:

    library(tidyverse)
    
    list.files(path = "path_to_data", full.names = TRUE) %>%
      map_dfr(read.csv) %>%
      group_by(date) %>%
      summarize(hour_sum = sum(hours)) 
    
    

    【讨论】:

    • 如果我理解正确,如果您使用map_dfr(read.csv, .id = "filename"),您会得到一个名为“文件名”的列,其中包含原始文件名,对吧?
    • 是的,.id 将创建一个名为“文件名”的列,并填充列表中每个元素的“名称”。我见过的最干净的解决方案是list.files('path') %&gt;% set_names() %&gt;% map_dfr(read.csv, .id = 'filename')
    • set_names() from purrr 包。
    【解决方案2】:

    也许你可以试试下面的代码

    aggregate(
      hours ~ date,
      do.call(rbind, c(lapply(list.files(pattern = "test\\d+\\.csv"), read.csv), make.row.names = FALSE)),
      sum
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 2013-10-28
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多