功能比将VSC文件合并到一个数据帧中

时间:2014-04-16 20:09:23

标签: r csv for-loop dataframe

我有一个包含300多个CSV文件的文件夹,每个文件都包含一个带标题的数据框。它们的名称为001.csv 002.csv,依此类推。所有文件都有相同的四列(DatesulfatenitrateID),但观察次数不同。

我想创建一个允许用户选择其中一个,全部或一系列文件并将它们合并到一个数据框中的函数,保留合并文件的所有数据(无需比较它们并查找重复,等等。当我说合并时,我的意思是新的合并数据框仍然有这四列与两个文件的观察结果。

以下是我到目前为止所做的工作,其中directory是文件的位置,id指定要加载的文件(例如:1将加载文件{{1} },001.csv加载文件274274.csv加载文件20:100020.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个变量:newDFV1V2(和y[FALSE,])。
原始文件中的4个变量应该有7,304个观察值。

问题出在我的row.names循环中。

1 个答案:

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