Как мне загрузить и объединить несколько файлов в r? - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь объединить файлы, но нахожу, что пишу очень избыточный код, что обременительно.Я посмотрел на документацию, но по какой-то причине не могу найти ничего о том, как это сделать.

По сути, я загружаю код с родной машины, а затем хочу объединить одинаковые столбцы для каждого файла (единственное отличие - год).

Можете ли вы помочь?

  • Я загружаю код со своего компьютера ("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 голосов
/ 22 декабря 2018

С риском казаться неприличным для саморекламы, я написал функцию, которая делает именно это (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

В этом случае всефайлы имеют идентичные столбцы и порядок (время, советы, мВ, событие), поэтому я могу просто method = "row_bind", и функция автоматически добавит имя файла в качестве дополнительного столбца.Доступны и другие методы:

"full_join" (по умолчанию) возвращает все столбцы и строки.«left_join» возвращает все строки из первого файла и все столбцы из последующих файлов.«inner_join» возвращает строки из первого файла, которые имеют совпадения в последующих файлах.

Внутренне, функция создает список файлов по пути (рекурсивный или нет), запускает lapply() вlist, а затем обрабатывает объединение нового списка фреймов данных в один фрейм данных:

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))
}
0 голосов
/ 22 декабря 2018

Вы можете составить список .csv файлов в папке и затем прочитать их все вместе в один файл с purrr::map_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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...