Проблема при загрузке нескольких 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
в глобальной среде.