注:R には,read.fortran という関数があり,c("F2.1","F2.0","I2") というような指示を与えて数値として読みとる方法もある。しかし,FORTRAN の書式を知らない場合には,取っつきにくい。要するに読み取り方の指示をどのようにするかと言うことが眼目なので,以下のような方法を採ることもできる。
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 |
作業ディレクトリにある 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" |
各リスト要素ごとに,文字列を切り分け,数値に変換してデータ行列に格納する。
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 |
変数 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 |
データフレームに変換する。
> 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 |
> 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