0

たとえば、3 つのテキスト ファイルfile1.txtfile2.txtありますfile3.txt。すべてのファイルの列名は同じです (つまり、最初の 2 行)。3 つのファイルのすべてのデータを含む新しいテキスト ファイルを作成したいのですが、列の名前を繰り返したくありません。つまり、新しいファイルの列の名前は、最初の 2 行

read.table()とでそれを行う方法を知っていますwrite table()。しかし、別のオプションはありますか?何かのようなもの...file.append()

4

2 に答える 2

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")
于 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")

もう 1 つの解決策は、Bash ツールを使用してファイルを追加することです。たとえば、head tail および >> を参照してください。もちろん、これは Unix または Mac でのみ機能するか、Windows で MinGW または Cygwin を使用する場合にのみ機能します。これらのツールは、システム関数を使用して R 内から呼び出すことができます。

于 2012-11-15T13:42:29.557 に答える