Проблема при загрузке нескольких CSV файлов в единый фрейм данных в R с использованием rbind

Я написал следующую функцию для объединения файлов 300.csv. Мое имя каталога - "specdata". Я выполнил следующие шаги для выполнения,

шаг 1:

> x <- function(directory) { 

    dir <- directory

    data_dir <- paste(getwd(),dir,sep = "/")

    files  <- list.files(data_dir,pattern = '\\.csv')

    tables <- lapply(paste(data_dir,files,sep = "/"), read.csv, header = TRUE)

    pollutantmean <- do.call(rbind , tables)

}

шаг 2:

>x("specdata")

Шаг 3:

>head(pollutantmean)

Ошибка в голове (pollutantmean): объект 'pollutantmean' не найден

Какая ошибка я сделал в этом. Не могли бы вы объяснить кому-нибудь?

Спасибо в Advance.

Ответы

Ответ 1

В вашей функции много ненужного кода. Вы можете упростить его:

load_data <- function(path) { 
  files <- dir(path, pattern = '\\.csv', full.names = TRUE)
  tables <- lapply(files, read.csv)
  do.call(rbind, tables)
}

pollutantmean <- load_data("specdata")

Помните, что do.call + rbind относительно медленный. Вы могли бы найти dplyr::bind_rows или data.table::rbindlist значительно быстрее.

Ответ 2

```{r echo = FALSE, warning = FALSE, message = FALSE}

setwd("~/Data/R/BacklogReporting/data/PastDue/global/") ## where file are located

path = "~/Data/R/BacklogReporting/data/PastDue/global/"
out.file <- ""
file.names <- dir(path, pattern = ".csv")
for(i in 1:length(file.names)){
  file <- read.csv(file.names[i], header = TRUE, stringsAsFactors = FALSE)
  out.file <- rbind(out.file, file)
}

write.csv(out.file, file = "~/Data/R/BacklogReporting/data/PastDue/global/global_stacked/past_due_global_stacked.csv", row.names = FALSE) ## directory to write stacked file to

past_due_global_stacked <- read.csv("C:/Users/E550143/Documents/Data/R/BacklogReporting/data/PastDue/global/global_stacked/past_due_global_stacked.csv", stringsAsFactors = FALSE)

files <- list.files(pattern = "\\.csv$") %>%  t() %>% paste(collapse = ", ")
```

Ответ 3

Чтобы обновить сообщение профессора Уикхэма выше с кодом из более поздней purrr library, которую он соавтор с Лионелем Генри:

Tbl <-
    list.files(pattern="*.csv") %>% 
    map_df(~read_csv(.))

Если приведение типов навязчиво, вы можете заставить все столбцы быть как символы с этим.

Tbl <-
    list.files(pattern="*.csv") %>% 
    map_df(~read_csv(., col_types = cols(.default = "c")))

Если вы хотите окунуться в подкаталоги, чтобы создать список файлов для окончательной привязки, обязательно укажите имя пути, а также зарегистрируйте файлы с их полными именами в своем списке. Это позволит работать с привязкой за пределами текущего каталога. (Думая о полных путях как работающих как паспорта, чтобы позволить перемещаться назад через границы "." ).

Tbl <-
    list.files(path = "./subdirectory/",
               pattern="*.csv", 
               full.names = T) %>% 
    map_df(~read_csv(., col_types = cols(.default = "c"))) 

Как проф. Уикхем описывает здесь (примерно на полпути вниз):

map_df(x, f) фактически совпадает с do.call("rbind", lapply(x, f)), но под капотом намного эффективнее.

и спасибо Джейку Кауппу за то, что он представил мне map_df() здесь.

Ответ 4

В вашей текущей функции pollutantmean доступно только в области функции x. Измените свою функцию на

x <- function(directory) { 

    dir <- directory

    data_dir <- paste(getwd(),dir,sep = "/")

    files  <- list.files(data_dir,pattern = '\\.csv')

    tables <- lapply(paste(data_dir,files,sep = "/"), read.csv, header = TRUE)

    assign('pollutantmean',do.call(rbind , tables))

}

assign должен поместить результат do.call(rbind, tables) в переменную с именем pollutantmean в глобальной среде.