2012-11-15 60 views
0

我有例如3個文本文件:file1.txt,file2.txtfile3.txt在一個目錄中。所有文件具有相同的列名稱(即2個第一行)。我想創建一個新的文本文件,其中包含3個文件的所有數據,但我不想重複列的名稱,即新文件中列的名稱只能寫入一次,在前兩行如何追加一些文件並跳過前兩行?

我知道如何去做read.table()write table()。但是還有其他選擇嗎? 類似... file.append()

回答

1

沒有預先存在的file.append()的等價物,其中修剪除第一個文件之外的所有第一行。但是這是R,所以你可以編寫一個這樣做的函數,如下所示。

使用readLines()cat()將輸出看起來更像是由file.append()比會使用read.table()write.table()製作的文件。對於大文件,它也會更快。

file.trim.append <- function(fnames, outfile) { 
    ## Take header lines from first file 
    cat(readLines(fnames[1], n = 2), file = outfile, sep = "\n") 
    ## Append all but first two lines of each 
    lapply(fnames, function(fname) { 
     cat(readLines(fname)[-1:-2], file = outfile, 
      sep = "\n", append = TRUE) 
    }) 
} 

## Try it out 
write.table(head(mtcars), file="file1.txt") 
write.table(head(mtcars), file="file2.txt") 
write.table(head(mtcars), file="file3.txt") 
ff <- dir(pattern = "^file[[:digit:]]*.txt") 

file.trim.append(ff, "file123.txt") 
+0

我想知道爲什麼使用'cat'比'read.table'安全。你能擴充你對此的評論嗎? –

+1

@RomanLuštrik - 是的,「更安全」並不完全是正確的詞。我在想的是'read.table/write.table'不是真正可逆的情況。我解釋我的意思的最快方法就是嘗試下面的代碼:'write.table(read.table(text =「A B \ n10000000000000 0.123456789123456789」,header = T),row.names = F)'。由於'cat(readLines())'只讀寫字符,它不會產生從字符到數字('read.table()')然後返回字符('write.table() ')。 –

+0

坦克你回答。但它並不像我想要的那樣工作。我的標題是2第一行。新文件中列的名稱只能寫入一次。像這樣,標題的第二行每次都重複。我不知道如何修復它。 – Tali

0

如果您的數據適合內存,最簡單的方法是讀取所有文件,將它們附加到rowise並將大數據框轉儲。我會用plyr簡化它:

require(plyr) 
big_data = ldply(c("file1", "file2", etc), read.table) 
write.csv(big_data, file = "bigfile") 

另一個解決方案是使用Bash工具來附加文件。見例如頭尾,和>>。這隻適用於Unix或Mac,或在Windows下使用MinGW或Cygwin。這些工具可以使用系統功能從R中調用。

相關問題