我在目录中有3个文本文件:file1.txt
,file2.txt
和file3.txt
。所有文件具有相同的列名称(即2个第一行)。我想创建一个包含3个文件的所有数据的新文本文件,但我不想重复列的名称,即新文件中列的名称只能写入一次,在前两行。
我知道如何使用read.table()
和write table()
执行此操作。但还有另一种选择吗?
类似...... file.append()
答案 0 :(得分: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")
答案 1 :(得分:0)
如果您的数据适合内存,最简单的方法是读取所有文件,将它们添加为rowise并转储大数据框。我会用plyr来简化这个:
require(plyr)
big_data = ldply(c("file1", "file2", etc), read.table)
write.csv(big_data, file = "bigfile")
另一个解决方案是使用Bash工具附加文件。参见例如头尾,&gt;&gt;。这个只适用于Unix或Mac,或者在Windows下使用MinGW或Cygwin。可以使用系统函数从R中调用这些工具。