file1.txt
例如,我有 3 个文本文件:file2.txt
和file3.txt
在一个目录中。所有文件都具有相同的列名(即前 2 行)。我想创建一个新的文本文件,其中包含 3 个文件的所有数据,但我不想重复列的名称,即新文件中的列名必须只写一次,在前两行。
我知道如何使用read.table()
and来做到这一点write table()
。但是还有其他选择吗?就像是...file.append()
除了传递的第一个文件之外,没有任何预先存在的等价物file.append()
也修剪掉所有文件的第一行。但这是 R,所以你可以编写一个函数来执行此操作,如下所示。
使用readLines()
andcat()
将输出一个看起来更像由而file.append()
不是使用read.table()
and生成的文件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")
如果您的数据适合内存,最简单的方法是读取所有文件,将它们逐行追加并转储大数据帧。我会使用 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 中调用这些工具。