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を書き込みには、それ専用の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
たとえば次のようなカンマ区切りのテキストがあるとき、
"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」が、文字として解釈された結果と推測されます。