固定書式テキストファイルからデータを読む     Last modified: Jun 28, 2004

注:R には,read.fortran という関数があり,c("F2.1","F2.0","I2") というような指示を与えて数値として読みとる方法もある。しかし,FORTRAN の書式を知らない場合には,取っつきにくい。要するに読み取り方の指示をどのようにするかと言うことが眼目なので,以下のような方法を採ることもできる。

  1. 区切り文字によって区切られていないので,どの桁から何文字がどういうデータか,また,小数点以下何桁のデータかなどは,ファイルを用意した人が知っている。そして,それを R に教えてやらないといけない。
     1117521216362270   開始桁 終了桁
     2117032318083260      1    2  変数1
     3117231218981265      3    3  変数2
     4116712115050260      4    6  変数3
     51   12215050255      7    9  変数4
     6216011217060235     10   12  変数5
     7215032211030235     13   14  変数6
     8215621218075235     15   17  変数7
     9215621216360240
    10215821316865245

  2. ファイルの各行を,文字列としてリストに読み込む。
    作業ディレクトリにある fixed.data というファイルから,一行を文字列として入力する。
    > x <- scan("fixed.data", list(s=""), sep="\n")
    Read 10 records
    
    入力された文字列は,リストになる。
    > x
    $s
     [1] " 1117521216362270" " 2117032318083260" " 3117231218981265"
     [4] " 4116712115050260" " 51   12215050255" " 6216011217060235"
     [7] " 7215032211030235" " 8215621218075235" " 9215621216360240"
    [10] "10215821316865245"
    
    たとえば,ファイルの 3 行目は以下のように読み込まれている。
    > x$s[[3]]
    [1] " 3117231218981265"

  3. リストの各文字を,区切り情報に基づいて切り分けてデータにする。
    各リスト要素ごとに,文字列を切り分け,数値に変換してデータ行列に格納する。
    mapply の,第 3 引数,第 4 引数がそれぞれ,各変数の開始桁位置(c(1, 3, 4, 7, 10, 13, 15))と終了桁位置(c(2, 3, 6, 9, 12, 14, 17))。
    > z <- lapply(x$s, function(i) mapply(substr, i, c(1, 3, 4, 7, 10, 13, 15), c(2, 3, 6, 9, 12, 14, 17)))
    > dat <- t(sapply(z, as.numeric))
    
    作られたデータ行列。
    5 行目の変数 3 の位置にあった空白は,欠損値を表すためであったが,一連の操作で R における欠損値 NA に変換されている。
    > dat
          [,1] [,2] [,3] [,4] [,5] [,6] [,7]
     [1,]    1    1  175  212  163   62  270
     [2,]    2    1  170  323  180   83  260
     [3,]    3    1  172  312  189   81  265
     [4,]    4    1  167  121  150   50  260
     [5,]    5    1   NA  122  150   50  255
     [6,]    6    2  160  112  170   60  235
     [7,]    7    2  150  322  110   30  235
     [8,]    8    2  156  212  180   75  235
     [9,]    9    2  156  212  163   60  240
    [10,]   10    2  158  213  168   65  245

  4. 実際は小数点付きのデータなのに,データファイルには小数点を含めていない場合には,この後必要な操作をする(10k で割るなど)。
    変数 5 は,小数点以下 1 桁,変数 7 は,小数点以下 2 桁の数値
    > dat[,5] <- dat[,5]/10
    > dat[,7] <- dat[,7]/100
    
    > dat
          [,1] [,2] [,3] [,4] [,5] [,6] [,7]
     [1,]    1    1  175  212 16.3   62 2.70
     [2,]    2    1  170  323 18.0   83 2.60
     [3,]    3    1  172  312 18.9   81 2.65
     [4,]    4    1  167  121 15.0   50 2.60
     [5,]    5    1   NA  122 15.0   50 2.55
     [6,]    6    2  160  112 17.0   60 2.35
     [7,]    7    2  150  322 11.0   30 2.35
     [8,]    8    2  156  212 18.0   75 2.35
     [9,]    9    2  156  212 16.3   60 2.40
    [10,]   10    2  158  213 16.8   65 2.45

  5. 必要ならデータフレームに変換し,変数に名前を付ける。
    データフレームに変換する。
    > df <- data.frame(dat)
    
    変数に名前を付ける。
    > names(df) <- c("ID", "sex", "height", paste("var", 1:4, sep=""))
    
    作られたデータフレーム。
    > df
       ID sex height var1 var2 var3 var4
    1   1   1    175  212 16.3   62 2.70
    2   2   1    170  323 18.0   83 2.60
    3   3   1    172  312 18.9   81 2.65
    4   4   1    167  121 15.0   50 2.60
    5   5   1     NA  122 15.0   50 2.55
    6   6   2    160  112 17.0   60 2.35
    7   7   2    150  322 11.0   30 2.35
    8   8   2    156  212 18.0   75 2.35
    9   9   2    156  212 16.3   60 2.40
    10 10   2    158  213 16.8   65 2.45

このページの最初に述べた read.fortran 関数を使うと,非常に簡単にデータフレームとして読むことができる。
> x &lt;- read.fortran("fixed.data", c("i2", "i1", "2i3", "f3.1", "i2", "f3.2"))
> x

   V1 V2  V3  V4   V5 V6   V7
1   1  1 175 212 16.3 62 2.70
2   2  1 170 323 18.0 83 2.60
3   3  1 172 312 18.9 81 2.65
4   4  1 167 121 15.0 50 2.60
5   5  1  NA 122 15.0 50 2.55
6   6  2 160 112 17.0 60 2.35
7   7  2 150 322 11.0 30 2.35
8   8  2 156 212 18.0 75 2.35
9   9  2 156 212 16.3 60 2.40
10 10  2 158 213 16.8 65 2.45


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI