我有例如3個文本文件:file1.txt
,file2.txt
和file3.txt
在一個目錄中。所有文件具有相同的列名稱(即2個第一行)。我想創建一個新的文本文件,其中包含3個文件的所有數據,但我不想重複列的名稱,即新文件中列的名稱只能寫入一次,在前兩行。如何追加一些文件並跳過前兩行?
我知道如何去做read.table()
和write table()
。但是還有其他選擇嗎? 類似... file.append()
我有例如3個文本文件:file1.txt
,file2.txt
和file3.txt
在一個目錄中。所有文件具有相同的列名稱(即2個第一行)。我想創建一個新的文本文件,其中包含3個文件的所有數據,但我不想重複列的名稱,即新文件中列的名稱只能寫入一次,在前兩行。如何追加一些文件並跳過前兩行?
我知道如何去做read.table()
和write table()
。但是還有其他選擇嗎? 類似... file.append()
沒有預先存在的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")
如果您的數據適合內存,最簡單的方法是讀取所有文件,將它們附加到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中調用。
我想知道爲什麼使用'cat'比'read.table'安全。你能擴充你對此的評論嗎? –
@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() ')。 –
坦克你回答。但它並不像我想要的那樣工作。我的標題是2第一行。新文件中列的名稱只能寫入一次。像這樣,標題的第二行每次都重複。我不知道如何修復它。 – Tali