【列の操作】直感的な操作ができる R パッケージ dplyr の簡単な使い方 その2
今回は【行の操作】直感的な操作ができる R パッケージ dplyr の簡単な使い方 その1 - サービス化する世界 │ The World Is Service. の続きです。今回は列の操作をまとめます。使うデータは同じで infert です。
■列の操作に使う関数
select() 必要な列だけを取り出す。
rename() 列の名前を変更する。
mutate() 新しい列を追加する。
select() を使って age, case, stratum を取り出し、df に入れて 最初のほうを表示させます。
> df <- select(infert, age, case, stratum)
> head(df)
age case stratum
1 26 1 1
2 42 1 2
3 39 1 3
4 34 1 4
5 35 1 5
6 36 1 6
簡単に取り出せました。$ がいらないです。行の操作に使う関数と同じように「関数(データセット名, 操作したい対象)」でOKです。
rename() は列名を変更するときに使います。「rename(データセット, 新しい列名 = 既存の列名)」という使い方でOK。さっき作ったデータセット df にある3つの列の名前を変更してみます。
> df <- rename(df, 年齢 = age, ケース = case, 層 = stratum)
> head(df)
年齢 ケース 層
1 26 1 1
2 42 1 2
3 39 1 3
4 34 1 4
5 35 1 5
6 36 1 6
ちゃんと変更できました。列名をダブルクォーテーションで囲む必要はありません。新しくつける名前を = の左に置くことに注意です。
最後は mutate()。データセットを変えて、airquality を使ってみます。まず airquality を概観。
> head(airquality)
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
Temp は華氏だと思うので、摂氏に直してみます。「摂氏=(5÷9)×(華氏-32)」らしいです。華氏 Temp を 摂氏 に変換して、TempC という列を新たに作ります。データを df に入れて、最初のほうを表示させます。
> df <- mutate(airquality, TempC = (5 / 9) * (Temp - 32))
> head(df)
Ozone Solar.R Wind Temp Month Day TempC
1 41 190 7.4 67 5 1 19.44444
2 36 118 8.0 72 5 2 22.22222
3 12 149 12.6 74 5 3 23.33333
4 18 313 11.5 62 5 4 16.66667
5 NA NA 14.3 56 5 5 13.33333
6 28 NA 14.9 66 5 6 18.88889
なんか、TempC の小数点が多いので、さっき作った df の TempC を小数点1桁にしてみます。
> df <- mutate(df, TempC = round(TempC, 1))
> head(df)
Ozone Solar.R Wind Temp Month Day TempC
1 41 190 7.4 67 5 1 19.4
2 36 118 8.0 72 5 2 22.2
3 12 149 12.6 74 5 3 23.3
4 18 313 11.5 62 5 4 16.7
5 NA NA 14.3 56 5 5 13.3
6 28 NA 14.9 66 5 6 18.9
無事、変更できました。さて、Temp はもう必要ないので、削除してみようと思います。列の削除は select() を使ってできます。「-列名」でいけます。作ったデータを df2 に入れて、最初のほうを表示させてみます。
> df2 <- select(df, -Temp)
> head(df2)
Ozone Solar.R Wind Month Day TempC
1 41 190 7.4 5 1 19.4
2 36 118 8.0 5 2 22.2
3 12 149 12.6 5 3 23.3
4 18 313 11.5 5 4 16.7
5 NA NA 14.3 5 5 13.3
6 28 NA 14.9 5 6 18.9
TempC が Day の次に来たので、ちょっと変な感じ。Temp のように Wind の次に入れたいです。きっと select() でできるはず。やってみます。
> df3 <- select(df2, Ozone, Solar.R, Wind, TempC, Month, Day)
> head(df3)
Ozone Solar.R Wind TempC Month Day
1 41 190 7.4 19.4 5 1
2 36 118 8.0 22.2 5 2
3 12 149 12.6 23.3 5 3
4 18 313 11.5 16.7 5 4
5 NA NA 14.3 13.3 5 5
6 28 NA 14.9 18.9 5 6
無事、できました。同じ操作は添字と列番号を使うと下のようになります。
df3 <- df2[, c(1, 2, 3, 6, 4, 5)]
こっちのほうが入力する文字数が少ないです。でも、直感的ではない。dplyr は直感的な操作が魅力なので、私のような初級者は select() が楽ですね。
■参照文献
library(dplyr)をしたあとに
vignette("introduction", package = "dplyr")
で表示されるページ