読者です 読者をやめる 読者になる 読者になる

Knowledge As Practice

JAIST(東京)でサービス経営の研究をしている社会人大学院生の研究・勉強メモ(統計分析多め)。

【列の操作】直感的な操作ができる R パッケージ dplyr の簡単な使い方 その2

ノンプログラマーのためのR入門

今回は【行の操作】直感的な操作ができる 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")
で表示されるページ

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。