2012-07-02 50 views
3

当前,我的R循环(参见下文)会在每次迭代过程中覆盖自身。我想将每个循环的结果输出到文本文件中。将R循环的输出写入文件

详细信息: R初学者在这里想知道如何在脚本中包含一行,以便将每个文件的平均值计算写入文本文件。因此,脚本会创建一个新的空文本文件,然后脚本每次计算文件中第4列的平均值时,该值将输出到文本文件中的一行,其中包含column1中文件的名称和平均值in第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)) 



} 

回答

5

要做到这一点作为循环运行,在循环中添加:

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

然而,这将意味着很多的文件系统的开销,而且会更快的产生整个数据然后写入整个文件。因此,而不是你的循环写:

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:在write.csv(data.frame(FNAME =文件名[我],平均=平均),...: 尝试设置“追加”忽略 – user964689

+0

其他的解决方案寿感谢伟大的,所以快得多,你是对的! – 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 = ", ")