在R

时间:2015-12-04 16:24:58

标签: r

我正在开发一个项目,其中第一步涉及将大量数据帧合并在一起。

到目前为止,我在目录中导入了包含来自访问数据库的输出的所有.csv文件。这些是使用不同方法收集的数据,并按数据收集年份进行划分。所有这些元数据都包含在文件名中:Gap.2013.csv是包含2013年所有Gap-Intercept数据的csv,SR.2014.csv包含2014年的物种丰富度数据。

接下来,一段重复代码会创建一个指定“年”的列。变量和rbinds就像数据类型一样。

示例代码如下

setwd("AIMRD Exports/CSV") 
list.filenames <- list.files(pattern="*.csv") 
for (i in 1:length(list.filenames)) {
  assign(list.filenames[i],            
  read.csv(paste(list.filenames[i], sep='')))} 

Gap.2013.csv$Year <- 2013     
SR.2013.csv$Year <- 2013 
Gap.2014.csv$Year <- 2014     
SR.2014.csv$Year <- 2014 
Gap.2015.csv$Year <- 2015     
SR.2015.csv$Year <- 2015  
Gap <- rbind (Gap.2013.csv, Gap.2014.csv, Gap.2015.csv) 
SR <- rbind (SR.2013.csv, SR.2014.csv, SR.2015.csv)

有没有人对如何减少重复有任何建议?我的第一个是以某种方式修改顶部的循环并使用list.files(pattern = x),但到目前为止没有运气。

1 个答案:

答案 0 :(得分:1)

我建议保留前两行,以获取文件列表。然后你可以编写一个打破这些功能的函数。

library(plyr)
library(stringr)

myFun <- function(files, method) {
    files <- files[grep(method, files)] #Get a list of files for one type of method.
    dat <- mdply(files,
                 function(file) {
                     year <- str_extract(file, "\\d{4}")
                     iDat <- read.csv(file, stringsAsFactors=FALSE)
                     iDat$Year <- year
                     return(iDat)
                 })
    return(dat)
}

Gap <- myFun(list.files, 'Gap') #method argument is case-sensitive
SR <- myFun(list.files, 'SR')