按功能逐年读取特定数据文件

时间:2019-06-08 12:19:18

标签: r

我正在尝试编写一个将读取特定数据文件的函数。

我有如下内容:

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"

所以我想读20062005,处理我的数据,然后读2007,然后读2006并处理这些数据,等等。

编辑:

我认为我需要做的是在readdata函数中添加一行,该行将从文件路径grepyears "C:/folder/folder/destinationfolder/2009/file_2009.csv"并将其替换为{函数中的{1}}和year。因此,在year - 1函数中,可能看起来像这样:

readdata

EDIT2:这与我得到的效果不尽相同……

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)
}

给出此错误:

  

return(file1,file2)错误:多参数返回不是   允许

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,下面的函数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一年,但是不是,最后一个元素,因为那之后没有文件。