【问题标题】:R: save each loop result into one data frameR:将每个循环结果保存到一个数据帧中
【发布时间】:2015-08-06 15:41:39
【问题描述】:

我在 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)
 }

【问题讨论】:

  • 看看this 我的旧解决方案。我猜它可以很容易地适应数据框。只是pasteassign 的组合。

标签: r for-loop merge


【解决方案1】:

问题在于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)

【讨论】:

    【解决方案2】:

    我不能直接测试整个事情,因为我没有像你这样的文件的目录,但我测试了部分,我认为这应该可以作为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), .)
    

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 2021-03-04
      • 1970-01-01
      相关资源
      最近更新 更多