ファイルの読み込み
ここからは、前の記事で書いた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することが多い。