我正在开发一个项目,其中第一步涉及将大量数据帧合并在一起。
到目前为止,我在目录中导入了包含来自访问数据库的输出的所有.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),但到目前为止没有运气。
答案 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')