データの部分集合化(subset関数)
今回はRにデフォルトで内蔵されているmtcarsのデータを使って、データの部分集合化を学びます。mtcarsは1973~1974年の車のモデルについてそのデザインとガソリンの消費量に対する性能を評価したデータです。まずmtcarsのデータがどのようなものか見てみましょう。結果から32のデータ(行)と11の変数(列)を持つデータフレームであることが分かります
> class(mtcars) [1] "data.frame" > dim(mtcars) [1] 32 11 > summary(mtcars) mpg cyl disp hp drat wt qsec Min. :10.40 Min. :4.000 Min. : 71.1 Min. : 52.0 Min. :2.760 Min. :1.513 Min. :14.50 1st Qu.:15.43 1st Qu.:4.000 1st Qu.:120.8 1st Qu.: 96.5 1st Qu.:3.080 1st Qu.:2.581 1st Qu.:16.89 Median :19.20 Median :6.000 Median :196.3 Median :123.0 Median :3.695 Median :3.325 Median :17.71 Mean :20.09 Mean :6.188 Mean :230.7 Mean :146.7 Mean :3.597 Mean :3.217 Mean :17.85 3rd Qu.:22.80 3rd Qu.:8.000 3rd Qu.:326.0 3rd Qu.:180.0 3rd Qu.:3.920 3rd Qu.:3.610 3rd Qu.:18.90 Max. :33.90 Max. :8.000 Max. :472.0 Max. :335.0 Max. :4.930 Max. :5.424 Max. :22.90 vs am gear carb Min. :0.0000 Min. :0.0000 Min. :3.000 Min. :1.000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:3.000 1st Qu.:2.000 Median :0.0000 Median :0.0000 Median :4.000 Median :2.000 Mean :0.4375 Mean :0.4062 Mean :3.688 Mean :2.812 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:4.000 3rd Qu.:4.000 Max. :1.0000 Max. :1.0000 Max. :5.000 Max. :8.000
①$と[ ]を使って部分集合化する。
以下の例では[ ]を使ってcylが6のデータについて、mpgの平均を計算しています。cylはシリンダーの数、mpgはマイル/ガロン(≒3.8リットル)です。
> mean(mtcars$mpg[mtcars$cyl == 6]) [1] 19.74286
また下のようにgear(ギアの数)が5のものだけを選んで部分集合化し、gear5として保存することもできます。忘れてはいけない点として最後にカンマ(,)が必要になります。
> gear5 <- mtcars[mtcars$gear == 5, ] > gear5 mpg cyl disp hp drat wt qsec vs am gear carb Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.7 0 1 5 2 Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2 Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.5 0 1 5 4 Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.5 0 1 5 6 Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.6 0 1 5 8
②subset関数を使う
下の例ではsubset関数を使って、cylが4かつam(0:オートマ、1:マニュアル)が1のものだけを部分集合化しています
> cyl4 <- subset(mtcars, subset = cyl == 4 & am == 1) > cyl4 mpg cyl disp hp drat wt qsec vs am gear carb Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
また、下の例は上記と同じ部分集合化ですが、列としてmpg、cyl、wt、amだけを選択しています。
> cyl4s <- subset(mtcars, select = c(mpg, cyl, wt, am), subset = cyl == 4 & am == 1) > cyl4s mpg cyl wt am Datsun 710 22.8 4 2.320 1 Fiat 128 32.4 4 2.200 1 Honda Civic 30.4 4 1.615 1 Toyota Corolla 33.9 4 1.835 1 Fiat X1-9 27.3 4 1.935 1 Porsche 914-2 26.0 4 2.140 1 Lotus Europa 30.4 4 1.513 1 Volvo 142E 21.4 4 2.780 1
上記と同じことを$と[ ]を使って行うことができます。
> syl4r <- mtcars[mtcars$cyl == 4 & mtcars$am == 1, c("mpg", "cyl", "wt", "am")] > syl4r mpg cyl wt am Datsun 710 22.8 4 2.320 1 Fiat 128 32.4 4 2.200 1 Honda Civic 30.4 4 1.615 1 Toyota Corolla 33.9 4 1.835 1 Fiat X1-9 27.3 4 1.935 1 Porsche 914-2 26.0 4 2.140 1 Lotus Europa 30.4 4 1.513 1 Volvo 142E 21.4 4 2.780 1
③部分一致に対する条件文を作る
以下の例は、mpgが20以上かつgearが5又は4の条件に一致するものには1、一致しないものには0を割り当てる条件文です。mtcarsに新たにspcという変数(列)を追加しています。
> mtcars$spc <- ifelse(mtcars$mpg >= 20 & mtcars$gear == 5 | mtcars$gear == 4, 1, 0)