R言語のread.tableとwrite.table詳細

7645 ワード

データのさまざまな形式
一般に、データの各行の異なる要素はtabキー(txtファイル)、カンマ(csvファイル)、スペース等で区切ることができる.
また、データには行名と列名がある、データが格納されている場合は保存するか保存しないかを選択することができる.
以下に、いくつかの一般的なデータの形式(txtファイルの区切り記号はtabキー、csvファイルの区切り記号はカンマ)を示す.データの内容は一致し、行名は(「a 1」,「a 2」)であり、列名は(「A」,「B」,「C」)である.
    a.txt:
A    B    C
a1    0.1    0.2    1
a2    a    "a"    1

    b.txt:
A   B    C
0.1 0.2    1
a   "a"    1

    c.txt:
0.1 0.2    1
a   "a"    1

    a.csv:
,A,B,C
a1,0.1,0.2,1
a2,a,"a",1

     b.csv:
A,B,C
0.1,0.2,1
a,"a",1

     c.csv:
0.1,0.2,1
a,"a",1

データの入力
    read.table関数の宣言は次のとおりです.
read.table(file, header = FALSE, sep = "", quote = "\"'",
           dec = ".", row.names, col.names,
           as.is = !stringsAsFactors,
           na.strings = "NA", colClasses = NA, nrows = -1,
           skip = 0, check.names = TRUE, fill = !blank.lines.skip,
           strip.white = FALSE, blank.lines.skip = TRUE,
           comment.char = "#",
           allowEscapes = FALSE, flush = FALSE,
           stringsAsFactors = default.stringsAsFactors(),
           fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)

以下では、上記のデータを読み込むことからのみ、readを初歩的に説明する.table関数のパラメータの意味、具体的なパラメータの意味は自分でヘルプドキュメントを参照してください.
a.txt <- read.table("a.txt", quote = "'")  # a.txt <- read.table("a.txt", header = TRUE, quote = "", row.names = 1)
b.txt <- read.table("b.txt", header = TRUE, quote = "")
c.txt <- read.table("c.txt", quote = "")
a.csv <- read.table("a.csv", header = TRUE, sep = ",", quote = "", 
                    row.names = 1)
b.csv <- read.table("b.csv", header = TRUE, sep = ",", quote = "")
c.csv <- read.table("c.csv", sep = ",", quote = "")
a.csv <- read.csv("a.csv", quote = "", row.names = 1)
b.csv <- read.csv("b.csv", quote = "")
c.csv <- read.csv("c.csv", header = FALSE, quote = "")

そのうちread.csv関数はcsvファイルを処理するためにread.table関数が変形する.
上記のコードから分かるように、
    1. ヘッダーは、元のファイルにカラム名が含まれているかどうかを指定します.tableのデフォルト値はFALSE,read.csvのデフォルト値はTRUEである.a.txtファイルにはカラム名が含まれていますが、read.tableの読み出しにはデフォルトパラメータFALSEが使用するが、エラーがないのは、ヘッダパラメータが指定する場合、最初の行の要素が他の行の要素より1つ少ない場合、自動的にヘッダパラメータをTRUEに設定するためである.
    2. sepは区切り記号を指定するためのものである.デフォルト値は「」で、1つ以上のスペース、tabキー、新しい行、戻りキーを表します.read.csvのデフォルト値は「,」.
    3. quoteは文字型変数を囲む記号を指定するために用いる、読み込んだ後に自動的に取り除く.read.tableのデフォルト値は"""である、read.csvのデフォルト値は"""であるため、aと"a"の差を保つためにquoteを"に設定. 
    4. row.namesは行名を指定するために用いる、数値kの場合、k番目の列を列名としてデータから削除する.a.txtファイルには行名が含まれていますが、read.tableのデフォルトはrowを設定しません.namesパラメータ、エラーがない原因はrowを指定していないからです.namesパラメータの場合、最初の行の要素が他の行の要素より1つ少ない場合、自動的にrow.namesパラメータを1に設定        
出力データ
   write.table関数の宣言は次のとおりです.
write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ",
            eol = "
", na = "NA", dec = ".", row.names = TRUE,             col.names = TRUE, qmethod = c("escape", "double"),             fileEncoding = "")

以下、出力上記データから入力前と同様のファイルのみを得るwrite.table関数のパラメータの意味、具体的なパラメータの意味は自分でヘルプドキュメントを参照してください.
a.txt <- write.table(a.txt, "a.txt", quote = FALSE, sep = "\t")    
b.txt <- write.table(b.txt, "b.txt", quote = FALSE, sep = "\t", 
                     row.names = FALSE)
c.txt <- write.table(c.txt, "c.txt", quote = FALSE, sep = "\t", 
                     row.names = FALSE, col.names = FALSE)
a.csv <- write.table(a.csv, "a.csv", quote = FALSE, sep = ",", col.names = NA)
b.csv <- write.table(b.csv, "b.csv", quote = FALSE, sep = ",", 
                     row.names = FALSE)
c.csv <- write.table(c.csv, "c.csv", quote = FALSE, sep = ",", 
                     row.names = FALSE, col.names = FALSE)
a.csv <- write.csv(a.csv, "a.csv", quote = FALSE)
b.csv <- write.csv(b.csv, "b.csv", quote = FALSE, row.names = FALSE)
c.csv <- write.csv(c.csv, "c.csv", quote = FALSE, row.names = FALSE, 
                   col.names = FALSE)

その中でwrite.csv関数はcsvファイルを処理するためにwrite.table関数が変形する.
上記のコードから分かるように、
    1. quoteは、文字型変数に二重引用符を付けるか否かを指定するために用いる. 
    2. sepは区切り記号を指定するためのものである.write.tableのデフォルト値は「」、write.csvのデフォルト値は「,」であり、変更できません.
    3. row.namesは行名を出力かどうかを指定する. 
    4. col.namesはカラム名を出力するかどうかを指定する.write.tableはNAに設定ことができ、列名の前に1つの位置が空いていることを示し、write.csvはNAに設定ことができず、TRUEに設定場合、デフォルトでは1つの位置が空けられ、変更できない.
拡張読書
    1. write.tableデータのデフォルト形式
    default.table
"A" "B" "C"
"a1" "0.1" "0.2" 1
"a2" "a" "\"a\"" 1

次のコードを実行します.tableファイルは変更しない
input <- read.table("default.table")
write.table(input, "default.table")

    2. write.csvにはデフォルトのデータ形式は存在しません
    3. Rは主にデータ分析に用いられ、テキスト処理はperlに渡し、データ型をperlに適合させる
    default.table
    A    B    C
a1    0.1    0.2    1
a2    a    "a"    1

読み出しおよび出力コードは次のとおりです.
default.table <- read.table("default.table", sep = "\t", quote = "")  #      ,        quote,                ,        
write.table(default.table, "default.table", quote = FALSE, sep = "\t", 
            col.names = NA)

    4. appendを使用して中間実行結果を保存する
例えば、行ごとに100個のU[0,1]分布乱数を生成する必要があり、以下のコードは、100個の乱数を生成するごとに1回保存することを示す.
colnames <- t(c("", paste("X", 1:100, sep = "")))
write.table(colnames, "random.table", quote = FALSE, sep = "\t", 
            row.names = FALSE, col.names = FALSE)
i <- 1
while (1) {
  write.table(t(c(i, runif(100))), append = TRUE, "random.table", quote = FALSE, sep = "\t",
              row.names = FALSE, col.names = FALSE)
  i <- i + 1
}

    5. 長さの異なるデータ読み出し
    awful.table
    A    B    C
a1    0.1    0.2    1
a2    a    "a"    1
a3    3    3    3
a4    4    4    4    4
a5    5    5    5    5    5
a6    6    6    6         6    6

列名の数よりも多くの行の要素があることは明らかです.read.tableは自動列名補完(誤りがある場合は訂正が面倒)をサポートしないはずなので、headerはFALSEに設定、各行の要素の個数を一致させるためにfillをTRUEに設定、空のセルをNAに設定する場合はnaを設定することができる.stringsは「」であり、sep分割の空文字を1つのユニットにするためにstripを設定することができる.whiteはTRUEであり、文字型要素を含む列がfactorにならないようにstringsAsFactorsをFALSEに設定することができる.
なお、この場合、特に列名を指定する必要がある、そうでない場合、Rプログラムは、最初の5行から自動的に列の個数を算出するので、ここではcol.names=paste("X",1:7,sep=")を設定.
awful.table <- read.table("awful.table", header = FALSE, sep = "\t", quote = "",
                          col.names = paste("X", 1:7, sep = ""), 
                          na.strings = "", fill = TRUE, strip.white = TRUE,
                          stringsAsFactors = FALSE)
colnames(awful.table) <- ifelse(is.na(awful.table[1, ]),
                                colnames(awful.table), awful.table[1, ])
awful.table <- awful.table[-1, ]
rownames(awful.table) <- awful.table[, 1]
awful.table <- awful.table[, -1]