R:将每个循环结果保存到一个数据帧中

时间:2015-08-06 15:41:40

标签: r for-loop merge

我在R中写了一个循环(仍然在学习)。我的目的是从每个循环文件​​中选择最大AvgConc和最大Roll_TotDep,然后有两个数据框,每个数据框包含从各个文件中选取的所有最大数字。我写的代码只保存最后的迭代结果(只有一个文件)...有人能指出我修改我的代码的正确方向,所以我可以将每个新迭代的结果与之前的迭代结果相加吗?谢谢!

data.folder <- "D:\\20150804"
files <- list.files(path=data.folder)

for (i in 1:length(files)) {
  sub <- read.table(file.path(data.folder, files[i]), header=T)
  max1Conc <- sub[which.max(sub$AvgConc),]
  maxETD <- sub[which.max(sub$Roll_TotDep),]
  write.csv(max1Conc, file= "max1Conc.csv", append=TRUE)
  write.csv(maxETD, file= "maxETD.csv", append=TRUE)
 }

2 个答案:

答案 0 :(得分:0)

问题是max1ConcmaxETD不是lists data.framesvectors(或其他类型的能够存储多个值的对象) 。

解决此问题:

maxETD<-vector()
max1Conc<-vector()
for (i in 1:length(files)) {
  sub <- read.table(file.path(data.folder, files[i]), header=T)
  max1Conc <- append(max1Conc,sub[which.max(sub$AvgConc),])
  maxETD <- append(maxETD,sub[which.max(sub$Roll_TotDep),])
  write.csv(max1Conc, file= "max1Conc.csv", append=TRUE)
  write.csv(maxETD, file= "maxETD.csv", append=TRUE)
 }

这里的区别在于我创建了两个你希望写出空向量的变量(max1ConcmaxETD),然后使用append命令将每个连续值添加到向量。

有更多惯用的R方法可以实现您的目标;就个人而言,我建议你研究apply系列函数。 (http://adv-r.had.co.nz/Functionals.html

答案 1 :(得分:0)

我不能直接测试整个事情,因为我没有像你这样的文件的目录,但我测试了部分,我认为这应该是apply驱动的替代方案。它从一对函数开始,一个用于从目录中摄取文件,另一个用于从每个文件中的两个最大值中取出一行:

library(dplyr)
data.folder <- "D:\\20150804"

getfile <- function(filename) {
    sub <- read.table(file.path(data.folder, filename), header=TRUE)
    return(sub)
}

getmaxes <- function(df) {
    rowi <- data.frame(AvConc.max = max(df[,"AvConc"]), ETD.max = max(df[,"ETD"]))
    return(rowi)
}

然后它使用了几轮lapply ---嵌入在管道dplyr中 - 来a)建立一个列表,每个数据集作为项目,b)建立一个第一个数据帧的第二个列表,其中包含第一个列表中每个项目的最大值,c)rbind将这些行分成一个大数据帧,d)然后cbind将该文件名添加到该数据框中参考

dfmax <- lapply(as.list(list.files(path = data.folder)), getfiles) %>%
    lapply(., getmaxes) %>%
    Reduce(function(...) rbind(...), .) %>%
    data.frame(file = list.files(path = data.folder), .)