【问题标题】:Write output of R loop to file将 R 循环的输出写入文件
【发布时间】:2012-07-02 11:37:33
【问题描述】:

目前我的 R 循环(见下文)在每次迭代期间都会覆盖自身。我想将每个循环的结果输出到一个文本文件中。

更详细: R初学者在这里想知道如何在我的脚本中包含一行,以便将每个文件的平均值计算写入文本文件。这样脚本会创建一个新的空文本文件,然后每次脚本计算文件中第 4 列的平均值时,该值都会输出到文本文件中的一行,该行包含第 1 列中的文件名和第 1 列中的平均值第 2 栏。 感谢您的帮助!

filename <- system("ls /dir/",intern=TRUE)

for(i in 1:length(filename)){

file <- read.table(filename[i],header=FALSE) ## if you have headers in your files ##
mean <- mean(as.numeric(file$V4))



}

【问题讨论】:

    标签: r loops


    【解决方案1】:

    要在循环运行时执行此操作,请在循环中添加:

    write.csv(data.frame(fname=filename[i],mean=mean),file="output.csv",append=TRUE)
    

    但是,这将意味着大量的文件系统开销,并且在 R 中生成整个数据帧然后将文件作为一个整体写入会更快。所以代替你的循环写:

    means <- sapply(filename, function(x) mean(as.numeric(read.table(x,header=FALSE)$V4)))
    

    然后将文件作为一个整体写入:

    write.csv(data.frame(fname=filename,mean=means),file="output.csv")
    

    【讨论】:

    • 谢谢我试试这些,在将它添加到我的循环的低效解决方案中,它提出了 1:在 write.csv(data.frame(fname = filename[i], mean = mean), ...:尝试设置“附加”被忽略
    • 其他解决方案非常好,谢谢,你说得对!
    【解决方案2】:

    以下脚本将首先创建仅包含列名的文件,然后附加每个结果。

    filename <- system("ls /dir/",intern=TRUE)
    
    column_names <- data.frame(filename = "filename", mean = "mean")
    write.table(column_names, file = "output.csv", row.names = FALSE, 
                append = FALSE, col.names = FALSE, sep = ", ", quote = TRUE)
    
    for(i in 1:length(filename)){
      file <- read.table(filename[i],header=FALSE)
      newline <- data.frame(t(c(filename[i], mean(as.numeric(file$V4)))))
      write.table(newline, file = "output.csv", row.names = FALSE, 
                  append = TRUE, col.names = FALSE, sep = ", ")
    }
    

    虽然在每个步骤中写入文件效率不是很高,您可能会考虑只在最后进行:

    filename <- system("ls /dir/",intern=TRUE)
    
    results <- data.frame(filename = "filename", mean = "mean")
    
    for(i in 1:length(filename)){
      file <- read.table(filename[i],header=FALSE)
      newline <- data.frame(t(c(filename = filename[i], mean = mean(as.numeric(file$V4)))))
      results <- rbind(results, newline)
    }
    write.table(results, file = "output.csv", row.names = FALSE, 
                append = FALSE, col.names = TRUE, sep = ", ")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 2020-08-08
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      相关资源
      最近更新 更多