2012-07-02 49 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 = ", ")