テキストファイル

読み込み

read.table(
    file,
    header = FALSE,
    sep = "",
    quote = "\"'",
    dec = ".",
    numerals = c("allow.loss", "warn.loss", "no.loss"),
    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)
R: Data Input

sepを既定値の""としたときは、1つ以上の空白、タブ、改行 (newlines) または復帰 (carriage returns) で区切られます。

たとえばsample.txtの名前で、

11 12
21 22

のテキストファイルがあるとき、read.table()では次のように読み込めます。

> a <- read.table("sample.txt")
> print(a)
  V1 V2
1 11 12
2 21 22

> class(a)
[1] "data.frame"

> str(a)
'data.frame':   2 obs. of  2 variables:
 $ V1: int  11 21
 $ V2: int  12 22

読み込まれたデータの型はdata.frameであり、個々の項目には次のようにアクセスできます。

> print(a[1,1])
[1] 11

> print(a[2,2])
[1] 22


> print(a[1,])
  V1 V2
1 11 12

> print(a[,1])
[1] 11 21

> print(a$V1)
[1] 11 21

データの項目が数値ならば、

> plot(a)

のように、そのままデータを渡して図示することもできます。

書き込み

write(
    x,
    file = "data",
    ncolumns = if(is.character(x)) 1 else 5,
    append = FALSE,
    sep = " ")
R: Write Data to a File

fileに空文字列を指定すると標準出力へ出力され、そこで書き込み内容を確認できます。

> (a <- c("AA","B", 10))
[1] "AA" "B"  "10"

> write(a, "")
AA
B
10

文字のベクトル以外は5列で改行されるため、それが期待するものでなければ、引数のncolumnsで1行あたりの要素数を指定します。

> (a <- 1:12)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12


> write(a, "")
1 2 3 4 5
6 7 8 9 10
11 12

> write(a, "", ncolumns=length(a)) # 要素数を指定することで、1行にまとめる
1 2 3 4 5 6 7 8 9 10 11 12

データが行列ならば、t()で転置させ、列数を指定します。

> (a <- matrix(1:6, 2))
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6


> write(a, "") #
1 2 3 4 5
6

> write(t(a), "")
1 3 5 2 4
6

> write(t(a), "", ncol(a))
1 3 5
2 4 6

data.frameの書き込み

data.frameを書き込みには、それ専用のwrite.table()を用います。

write.table(
    x,
    file = "",
    append = FALSE,
    quote = TRUE,
    sep = " ",
    eol = "\n",
    na = "NA",
    dec = ".",
    row.names = TRUE,
    col.names = TRUE,
    qmethod = c("escape", "double"),
    fileEncoding = "")
R: Data Output
> (a <- data.frame(x=1:2, y=3:4))
  x y
1 1 3
2 2 4

> write.table(a, "")
"x" "y"
"1" 1 3
"2" 2 4

> write(a, "") # write()でのdata.frameの書き込み
 cat(list(...), file, sep, fill, labels, append) でエラー:
   引数 1 (タイプ 'list') は 'cat' で取り扱えません
> (a <- matrix(1:6, 2))
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

> write.table(a, "") # write.table()でのmatrixの書き込み
"V1" "V2" "V3"
"1" 1 3 5
"2" 2 4 6

> write(a, "")
1 2 3 4 5
6

CSVの読み書き

たとえば次のようなカンマ区切りのテキストがあるとき、

"A","B","C"
10,11,"X"
20,21,"Y"

read.table()でもsepを","とすることで読み込めますが、

> a <- read.table("sample.csv")
 scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  でエラー:
   2 行目には 2 個の要素がありません

> a <- read.table("sample.csv", sep=",")
> str(a)
'data.frame':   3 obs. of  3 variables:
 $ V1: Factor w/ 3 levels "10","20","A": 3 1 2
 $ V2: Factor w/ 3 levels "11","21","B": 3 1 2
 $ V3: Factor w/ 3 levels "C","X","Y": 1 2 3

このようなCSV形式のテキストを読み込む、専用の関数が用意されています。

read.csv(
    file,
    header = TRUE,
    sep = ",",     # フィールド区切り文字
    quote = "\"",
    dec = ".",     # 小数点の文字
    fill = TRUE,
    comment.char = "",
    ...)
R: Data Input
> a <- read.csv("sample.csv")
> print(a)
   A  B C
1 10 11 X
2 20 21 Y

> str(a)
'data.frame':   2 obs. of  3 variables:
 $ A: int  10 20
 $ B: int  11 21
 $ C: Factor w/ 2 levels "X","Y": 1 2

データの分析

> a <- read.csv("sample.csv")
> print(a)
   A  B C
1 10 11 X
2 20 21 Y

> max(a$A) # A列の最大値
[1] 20

> max(a$B) # B列の最大値
[1] 21

> subset(a, B>20) # B列で20より大きな値を含むデータ
   A  B C
2 20 21 Y

トラブル対処法

読み込み時の警告

読み込み時に「incomplete final line found by readTableHeader on 'sample.txt'」と警告されるときには、ファイルの末尾に改行を追加します。CSVの定義では末尾には改行を含まないとされていますが、Rではそれが不適とされます。

読み込みの失敗

読み込み時に「'<ef>サ<bf>' に不正なマルチバイト文字があります」としてエラーとなるときには、ファイルの文字コードをBOMのないUTF-8に変換します。「'<ff><fe><61>' に不正なマルチバイト文字があります」となるときには、ビッグエンディアンのUTF-16BEに変換します。

なお、この「<ef>サ<bf>」はUTF-8のBOMである「EF BB BF」が、文字として解釈された結果と推測されます。

  • EF → <ef>
  • BB → サ (JIS X 0201におけるコード)
  • BF → <bf>