将R循环的输出写入文件

5

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

更详细地说: 作为一个R初学者,我想知道如何在我的脚本中加入一行,以便计算每个文件的平均值并将其写入文本文件。因此,脚本将创建一个新的空文本文件,然后每次脚本计算文件中第4列的平均值时,该值都会输出到文本文件中的一行中,该行包含文件名在第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))



}
2个回答

6
在循环运行时执行此操作,只需在循环中添加以下内容即可: ```html

在您的循环中添加:

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

然而,这意味着会有很多文件系统开销,更快的方法是在R中生成整个数据框,然后作为一个整体写入文件。因此,不要使用循环,而应该写成:
```R write.table(df, file = "filename.csv", sep = ",", row.names = FALSE) ```
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
谢谢,我会尝试这些方法。在将它添加到我的循环中的低效解决方案中,出现了以下错误:1: In write.csv(data.frame(fname = filename[i], mean = mean), ... : attempt to set 'append' ignored。 - user964689
其他解决方案也很好,谢谢,而且你说得对,速度快多了! - user964689

4
下面的脚本将通过首先创建只有列名的文件,然后附加每个结果来完成此操作。
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 = ", ")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接