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」が、文字として解釈された結果と推測されます。