0

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

我知道如何使用read.table()and来做到这一点write table()。但是还有其他选择吗?就像是...file.append()

4

2 回答 2

1

除了传递的第一个文件之外,没有任何预先存在的等价物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")
于 2012-11-15T13:45:22.577 回答
0

如果您的数据适合内存,最简单的方法是读取所有文件,将它们逐行追加并转储大数据帧。我会使用 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 中调用这些工具。

于 2012-11-15T13:42:29.557 回答