データの部分集合化(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)