日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

ファイルの読み込み

ここからは、前の記事で書いたmatrix1.txt, matrix4.txt, data.frame1.txtを使って話を進めます。

Rはスプレッドファイルなら、セパレータを指定すればread.table関数で読み込むことができます。
で、セパレータはタブ区切り、コンマ区切りの場合は、専用にread.delim(タブ区切りファイル用) やread.csv(csv
ァイル用) があります。

  • read.tableとread.delimの違いは引数sep="\t"です。
> # スプレッドファイルのセパレータ「タ ブ」をsep="\t"で指定
> x1 <- read.table("matrix1.txt",sep="\t")
> # read.delimならセパレータを指定しなくても大丈夫
> x2 <- read.delim("matrix1.txt")
> x1==x2
  col1 col2 col3
1 TRUE TRUE TRUE
2 TRUE TRUE TRUE
3 TRUE TRUE TRUE
4 TRUE TRUE TRUE

同じと分かります。

  • read.tableとread.delimの違いは引数sep=","です。
> # セパレータ「,」をsep=","で指定
> x1 <- read.table("matrix4.txt",sep=",",header=TRUE,row.names=1)
> x3 <- read.csv("matrix4.txt",row.names=1)
> x1==x3
  col1 col2 col3
1 TRUE TRUE TRUE
2 TRUE TRUE TRUE
3 TRUE TRUE TRUE
4 TRUE TRUE TRUE

read.table関数でsep=","を指定すると、デフォルトがheader=FALSE、row.names=NULLになっているようです。
(昔からそうだっけ?ちょっと記憶が曖昧。)

  • read.table関数系で読み込んだファイルの型はdata.frameになります。matrixを出力したオブジェクトでも、読み込んだあとはdata.frameです。
> is(x1);is(x2);is(x3)
[1] "data.frame" "list"       "oldClass"   "vector"    
[1] "data.frame" "list"       "oldClass"   "vector"    
[1] "data.frame" "list"       "oldClass"   "vector"    
  • 注意するのは、read.table系で読み込んだ場合、文字のカラムはfactorと認識されることです。
> y1 <- read.delim("data.frame1.txt")
> str(y1)
'data.frame':	3 obs. of  3 variables:
 $ num   : int  1 2 3
 $ char  : Factor w/ 3 levels "a","b","c": 1 2 3
 $ factor: Factor w/ 3 levels "A","B","C": 1 2 3

y$"char"は文字属性でしたが、read.delimで読み込むとfactorになっています。

で、character属性で読み込むには、引数colClassesかstringsAsFactorsを指定する。

> y2 <- read.delim("data.frame1.txt", colClasses=c("numeric","character","factor"))
> y3 <- read.delim("data.frame1.txt", stringsAsFactors=FALSE)
> str(y1);str(y2);str(y3)
'data.frame':	3 obs. of  3 variables:
 $ num   : int  1 2 3
 $ char  : Factor w/ 3 levels "a","b","c": 1 2 3
 $ factor: Factor w/ 3 levels "A","B","C": 1 2 3

'data.frame':	3 obs. of  3 variables:
 $ num   : num  1 2 3
 $ char  : chr  "a" "b" "c"
 $ factor: Factor w/ 3 levels "A","B","C": 1 2 3

'data.frame':	3 obs. of  3 variables:
 $ num   : int  1 2 3
 $ char  : chr  "a" "b" "c"
 $ factor: chr  "A" "B" "C"

colClassesは行毎に明示的に指定できる。
一方、stringsAsFactors=FALSEは、factorもcharacterになる。
だから、用途次第の引数かな。
個人的には個別指定が面倒なので、stringsAsFactors=FALSEにしてしまって、必要に応じて行をas.factorすることが多い。