在从R中的多个csv文件读取时向数据帧追加一行

时间:2014-05-18 06:44:21

标签: r csv dataframe

我正在读取循环中的多个csv文件,并对每个文件的数据执行一些计算,然后我希望将新行添加到数据框中:

for (i in csvFiles) {
    fileToBeRead<-paste(directory, i, sep="/")

    dataframe<-read.csv(paste(fileToBeRead, "csv", sep="."))
    file <- i
    recordsOK <- sum(complete.cases(dataframe))

    record.data <- data.frame(monitorID, recordsOK)
} 

所以,我想将文件和recordsOK作为新行添加到数据框中。这只是每次都覆盖数据帧,所以我最终会得到最新csv文件中的数据。如何保留上次迭代的数据?

1 个答案:

答案 0 :(得分:1)

一次构建一行data.frame几乎总是错误的方法。这里是一个更像R的解决方案

OKcount<-sapply(csvFiles, function(i) {
    fileToBeRead<-paste(directory, i, sep="/")

    dataframe<-read.csv(paste(fileToBeRead, "csv", sep="."))
    sum(complete.cases(dataframe))
})

record.data <- data.frame(monitorID=seq_along(csvFiles), recordsOK=OKcount)

主要的想法是,您通常以列为单位构建数据,而不是逐行构建数据,然后在完成所有操作后将其捆绑在data.frame中。因为R有很多矢量化操作,所以通常很容易。

但是如果你真的想要向data.frame添加行,你可以rbind(行绑定)其他行。所以不要每次都覆盖record.data,你会做

record.data <- rbind(record.data, data.frame(monitorID, recordsOK)

但这意味着您需要在循环外定义record.data并使用正确的列名和数据类型对其进行初始化,因为只能匹配data.frames。您可以使用

初始化它
record.data <- data.frame(monitorID=numeric(), recordsOK=numeric())