如何在r中下载并合并多个文件?

时间:2018-12-21 23:34:18

标签: r downloading

我正在努力合并文件,但是发现自己编写的代码非常冗余,这很麻烦。我查看了文档,但是由于某种原因找不到有关该操作的任何信息。

基本上,我从本机上下载代码,然后想要为每个文件合并完全相同的列(唯一的区别是年份)。

你能帮忙吗?

  • 我从计算机上下载代码(先从"C:/SAM/CODE1_2005.csv"然后是"C:/SAM/CODE1_2006.csv"然后是"C:/SAM/CODE1_2007.csv",直到2016年。

  • 然后我定义列,对于我每年下载的列都是一样的,例如COLLEGESCORECARD05_A<-subset(COLLEGESCORECARD05, select=c(ï..UNITID,OPEID,OPEID6,INSTNM))等...

  • ,然后将文件合并到一个数据库中。

问题在于,这似乎效率低下。有没有更有效的方法?

2 个答案:

答案 0 :(得分:0)

您可以列出文件夹中.csv个文件的列表,然后使用purrr::map_df将它们一起读入一个df文件中。您可以添加一列来区分文件,然后

library(tidyverse)

df <- list.files(path="C://SAM", 
                  pattern="*.csv") %>%
  purrr::map_df(function(x) readr::read_csv(x) %>%
  mutate(filename=gsub(" .csv", "", basename(x)))

答案 1 :(得分:0)

冒着自我促进的危险,我编写了一个函数来完成此操作(desiderata::apply_to_files()):

# Apply a function to every file in a folder that matches a regex pattern

rain <- apply_to_files(path = "Raw data/Rainfall", pattern = "csv", 
                       func = readr::read_csv, col_types = "Tiic", 
                       recursive = FALSE, ignorecase = TRUE, 
                       method = "row_bind")

dplyr::sample_n(rain, 5)

#> # A tibble: 5 x 5
#> 
#>   orig_source_file       Time                 Tips    mV Event 
#>   <chr>                  <dttm>              <int> <int> <chr> 
#> 1 BOW-BM-2016-01-15.csv  2015-12-17 03:58:00     0  4047 Normal
#> 2 BOW-BM-2016-01-15.csv  2016-01-03 00:27:00     2  3962 Normal
#> 3 BOW-BM-2016-01-15.csv  2015-11-27 12:06:00     0  4262 Normal
#> 4 BIL-BPA-2018-01-24.csv 2015-11-15 10:00:00     0  4378 Normal
#> 5 BOW-BM-2016-08-05.csv  2016-04-13 19:00:00     0  4447 Normal

在这种情况下,所有文件都具有相同的列和顺序(时间,技巧,mV,事件),所以我只能method = "row_bind",该函数会自动将文件名添加为额外的列。还有其他可用的方法:

  

“ full_join”(默认)返​​回所有列和行。 “ left_join”返回第一个文件的所有行,以及后续文件的所有列。 “ inner_join”返回第一个文件中与后续文件中匹配的行。

在内部,该函数在路径中构建文件列表(是否递归),在列表上运行lapply(),然后将新的数据帧列表合并为单个数据帧:

apply_to_files <- function(path, pattern, func, ..., recursive = FALSE, ignorecase = TRUE, 
                          method = "full_join") {
    file_list <- list.files(path = path,
                            pattern = pattern,
                            full.names = TRUE,      # Return full relative path.
                            recursive = recursive,  # Search into subfolders.
                            ignore.case = ignorecase)

    df_list <- lapply(file_list, func, ...)

    # The .id arg of bind_rows() uses the names to create the ID column.
    names(df_list) <- basename(file_list)

    out <- switch(method,
                  "full_join"  = plyr::join_all(df_list, type = "full"),
                  "left_join"  = plyr::join_all(df_list, type = "left"),
                  "inner_join" = plyr::join_all(df_list, type = "inner"),
                  # The fancy joins don't have orig_source_file because the values were
                  # getting all mixed together.
                  "row_bind"   = dplyr::bind_rows(df_list, .id = "orig_source_file"))

    return(invisible(out))
}