我有一个包含300多个CSV文件的文件夹,每个文件都包含一个带标题的数据框。它们的名称为001.csv
002.csv
,依此类推。所有文件都有相同的四列(Date
,sulfate
,nitrate
和ID
),但观察次数不同。
我想创建一个允许用户选择其中一个,全部或一系列文件并将它们合并到一个数据框中的函数,保留合并文件的所有数据(无需比较它们并查找重复,等等。当我说合并时,我的意思是新的合并数据框仍然有这四列与两个文件的观察结果。
以下是我到目前为止所做的工作,其中directory
是文件的位置,id
指定要加载的文件(例如:1
将加载文件{{1} },001.csv
加载文件274
和274.csv
加载文件20:100
到020.csv
)。
100.csv
我只在加载一个文件时工作,无论哪一个。如果我想加载一个范围,我得到一个空的数据框。例如,如果我运行:
getfile3 <- function(directory = getwd(), id) {
# add 0s to ID
filenames <- sprintf("%03d.csv", id)
# find requested files
filedir <- file.path(directory, filenames)
# determine number of files requested
numOfFiles <- length(filenames)
#create empty data frame to store merged files
dataset <- data.frame()
if(numOfFiles < 2) { # if only one file is requested...
dataset <- read.csv(filedir, header = TRUE) # use read.csv
} else { # else loop over each file requested and merge into "dataset"
for(i in filenames) {
dataset <- merge(dataset, filenames[i], all=TRUE)
}
}
dataset
}
其中newDF <- getfile3("specdata", 1:10)
是文件所在文件夹的名称,specdata
表示我想加载前10个文件,我得到一个新的数据框(1:10
) 0个观察结果和3个变量:newDF
,V1
,V2
(和y[FALSE,]
)。
原始文件中的4个变量应该有7,304个观察值。
问题出在我的row.names
循环中。
答案 0 :(得分:0)
将您的代码更改为
if(numOfFiles < 2) { # if only one file is requested...
dataset <- read.csv(filedir, header = TRUE) # use read.csv
} else { # else loop over each file requested and merge into "dataset"
#Use lapply to read in your data
data.reqd <-lapply(filedir, read.csv, header=T)
#Merge all the data, using Reduce
dataset <-Reduce(function(...) merge(...,all=T),data.reqd)
}
return(dataset)
}