如何附加一些文件并跳过前两行?

时间:2012-11-15 13:09:03

标签: r file

我在目录中有3个文本文件:file1.txtfile2.txtfile3.txt。所有文件具有相同的列名称(即2个第一行)。我想创建一个包含3个文件的所有数据的新文本文件,但我不想重复列的名称,即新文件中列的名称只能写入一次,在前两行

我知道如何使用read.table()write table()执行此操作。但还有另一种选择吗? 类似...... file.append()

2 个答案:

答案 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中调用这些工具。