我正在读取循环中的多个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文件中的数据。如何保留上次迭代的数据?
答案 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())