чтение в определенных файлах данных по годам в функции - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь написать функцию, которая будет читать определенные файлы данных.

У меня есть что-то вроде следующего:

files <- list.files("folder/destinationfolder", recursive = TRUE, pattern = ".csv")
files <- file.path("C:/", "folder", files)

Что дает мне что-то вроде следующего:

"C:/folder/folder/destinationfolder/2005/file_2005.csv"
"C:/folder/folder/destinationfolder/2006/file_2006.csv"
"C:/folder/folder/destinationfolder/2007/file_2007.csv"
"C:/folder/folder/destinationfolder/2008/file_2008.csv"
"C:/folder/folder/destinationfolder/2009/file_2009.csv"

Далее я могу прочитать эти файлы, выполнив следующее:

readdata <- function(fn){
  dt_temp <- fread(fn, sep=",")
  return(dt_temp)
}

mylist <- lapply(files, readdata)

df <- plyr::ldply(mylist, data.frame)

Однако я не заинтересован в загрузке всех файлов одновременно (позже у меня возникают проблемы с памятью). То, что я пытаюсь сделать, это прочитать год во время t и год во время t-1.

У меня есть следующая функция, которая собирает years из путей к файлам.

extract_years <- function(ex_years){
  foo <- gsub("\\..*","",ex_years)
  str_sub(foo, start= -4)
}

years_to_process <- extract_years(files)

Что дает этот вывод:

"2005" "2006" "2007" "2008" "2009"

Итак, я хотел бы прочитать в 2006, а также 2005, обработать мои данные и затем прочитать в 2007, а затем 2006 и обработать эти данные и т. Д.

EDIT:

Я думаю, что мне нужно в readdata добавить строку, которая будет grep years из пути к файлу "C:/folder/folder/destinationfolder/2009/file_2009.csv" и заменить ее на year в функции и year - 1. Так что в readdata функция может выглядеть так:

readdata <- function(fn){
# Grep the file path and replace the year with the year in the funciton
# Grep the file path again and replace the year with `t-1`
  dt_temp <- fread(fn, sep=",") # read in these two data files
  return(dt_temp)
}

РЕДАКТИРОВАТЬ 2: Это так близко, как я получил, который не работает ...

fucn <- function(years){
  file1 = str_replace_all(files, years, years)
  file2 = str_replace_all(files, years, as.character(as.numeric(years) + 1))
  return(file1, file2)
  dt_temp1 <- fread(file1, sep = ",")
  dt_temp2 <- fread(file2, sep = ",")
  return(dt_temp)
}

mylist <- lapply(years_to_process, fucn)

выдает эту ошибку:

Ошибка при возврате (файл1, файл2): возвращение с несколькими аргументами не разрешено

1 Ответ

1 голос
/ 08 июня 2019

Если я правильно понимаю вопрос, функция fucn ниже загружает два года и возвращает два кадра данных в именованном списке. Члены списка имеют соответствующие годы в качестве своих имен.

Я также упростил функцию extract_years, так что ей не нужен пакет stringr, только база R.

extract_years <- function(ex_years){
  sub("^.*_([[:digit:]]+)\\..*$", "\\1", files)
}

fucn <- function(years){
  year1 <- as.integer(years)
  year2 <- years1 + 1L
  file1 <- grep(year1, files, value = TRUE)
  file2 <- grep(year2, files, value = TRUE)
  dt_temp1 <- fread(file1, sep = ",")
  dt_temp2 <- fread(file2, sep = ",")
  res <- list(dt_temp1, dt_temp1)
  names(res) <- c(year1, year2)
  res
}

yrs <- extract_years(files)

Теперь вызовите fucn с одним годом от вектора yrs за раз, но не с последним элементом, поскольку после этого файла нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...