2017-07-06 67 views
0

我有一個需要應用測試的單個文件的內容。我需要找到將每個文件的結果自動寫入文件的方式。這是我做的:在循環中依次寫入結果r

library(ape) 
stud_files <- list.files("path/dir/data",full.names = T) 
for (f in stud_files) { 
df <- read.table(f, header=TRUE, sep=";") 
df_xts <- as.xts(df$cola, order.by = as.Date(df$colb,"%m/%d/%Y")) 
pet <- testa(df_xts) 
res <- data.frame(estimate = pet$estimate, 
       p.value=pet$p.value, 
       logi = pet$alternative) 
write.dna(res,file = "res_testa.xls",format = "sequential") 
} 

這個循環運作良好,除了其目的是連續寫入每個文件的結果的最後一個命令,它僅保存最後一場演出。結果保存爲字符串,而不是上面定義的表(data.frame)。在這種情況下的任何想法?在此先感謝

+0

是否可以保存每次迭代的res,然後將它們綁定在一起並一次寫入文件? – JAD

+1

嘗試在您的寫入語句中添加「append = TRUE」 – Dave2e

+0

@JarkoDubbeldam:我的想法是在轉向下一個文件之前立即保存它。我認爲它應該比將它們綁定在表格中並將它們全部寫入的方式更簡單,或者? – Hari

回答

2

檢查help(write.dna)

write.dna(X,文件,格式= 「交錯」,追加= FALSE, nbcol = 6,COLSEP = 「」,colw = 10,縮進= NULL, blocksep = 1)

附加一個邏輯,如果TRUE數據被附加到文件,而不刪除該文件中可能存在的數據,否則該文件(如果它存在 )被覆蓋(FALSE爲默認值)。

設置append = TRUE你應該全部設置。然而,正如一些評論指出的那樣,你可能更適合生成你的表格,然後將它一次寫入一個文件。除非您擁有數十億個文件,否則您的內存可能不會用完。

下面是我將如何處理這個問題。

library(ape) 
library(data.table) 

stud_files <- list.files("path/dir/data",full.names = T) 

sumfunc <- function(f) { 

    df <- read.table(f, header=TRUE, sep=";") 
    df_xts <- as.xts(df$cola, order.by = as.Date(df$colb,"%m/%d/%Y")) 
    pet <- testa(df_xts) 
    res <- data.table(estimate = pet$estimate, 
        p.value=pet$p.value, 
        logi = pet$alternative) 
    return(res) 

} 

lres <- lapply(stud_files, sumfunc) 
dat <- rbindlist(lres) 

write.table(dat, 
      file = "res_testa.csv", 
      sep = ",", 
      quote = FALSE, 
      row.names = FALSE) 
+0

非常感謝。結果列,但在這樣的行:估計2195 p.value 1.40119324 LOGI真昌 日期1960年5月3日 我希望它們出現在一個表時,我寫了data.frame當我寫它時,我怎麼能把它們保存在一個table/data.frame中?謝謝 – Hari

+0

是否有你需要使用'write.dna'的理由?你可以使用'write.csv'或'write.table'來以表格格式輸出結果'res'。它具有相同的'append = TRUE'參數。 –

+0

我實際上首次使用write.dna,目的是在循環中連續寫入結果。我試過write.table和write.scv或write.xlsx,但它有同樣的問題。 – Hari