こんにちは,shun(@datasciencemore)です!
今回はmutateについて解説していきます.
mutateは列を追加するんでしたね.
こちらについても単純なようですが意外と奥が深いので,じっくり見ていきましょう.
今回のデータは,diamondsを使用します.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
> diamonds # A tibble: 53,940 x 10 carat cut color clarity depth table price x y z <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl> 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31 3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31 4 0.290 Premium I VS2 62.4 58 334 4.2 4.23 2.63 5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75 6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48 7 0.24 Very Good I VVS1 62.3 57 336 3.95 3.98 2.47 8 0.26 Very Good H SI1 61.9 55 337 4.07 4.11 2.53 9 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49 10 0.23 Very Good H VS1 59.4 61 338 4 4.05 2.39 # … with 53,930 more rows |
1.基本
mutateは,次のように使います.
データフレーム %>%
mutate(列名1 = ベクトル1, 列名2 = ベクトル2)
このコードを実行すると,元のデータフレームの右側に列名1とベクトル1,列名2とベクトル2が図のように追加されます.
ポイントは,指定するベクトルの長さが元のデータフレームの行数と一致させていれば,どんなベクトルでも格納できることです.
よって,単に数値や文字列を追加するだけでなく,元のデータフレームのデータ(以降,元データと呼ぶ.)をいろいろ加工したベクトルを追加することも可能です.
2.定数の追加
元データにnew列を追加して,その中に文字列の"test"を入れてみましょう.
1 2 3 |
# new列を追加 diamonds %>% mutate( new = "test" ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# A tibble: 53,940 x 11 carat cut color clarity depth table price x y z new <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <chr> 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43 test 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31 test 3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31 test 4 0.290 Premium I VS2 62.4 58 334 4.2 4.23 2.63 test 5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75 test 6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48 test 7 0.24 Very Good I VVS1 62.3 57 336 3.95 3.98 2.47 test 8 0.26 Very Good H SI1 61.9 55 337 4.07 4.11 2.53 test 9 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49 test 10 0.23 Very Good H VS1 59.4 61 338 4 4.05 2.39 test # … with 53,930 more rows |
1 |
無事に一番右端にnew列が追加できていることが確認できました.
-
【R前処理講座6】ベクトル【baseR】
こんにちは,shun(@datasciencemore)です!! 前回はデータ型についてやりましたね,覚えているでしょうか?今回はベクトルについてやっていきます.前回のデータ型がわからないとよく理解で ...
続きを見る
3.元データの加工
元データを加工して,さまざまなベクトルに変形することができます. 例えば,元データにnew列を追加して,その中にdepth列を2倍にした値とtable列を5倍にした値を足した値を入れることを考えましょう. (この計算式に深い意味はありません笑)
1 2 3 |
# new列に2 * depth + 5 * tableを追加 diamonds %>% mutate( new = 2 * depth + 5 * table ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# A tibble: 53,940 x 11 carat cut color clarity depth table price x y z new <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <dbl> 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43 398 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31 425. 3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31 439. 4 0.290 Premium I VS2 62.4 58 334 4.2 4.23 2.63 415. 5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75 417. 6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48 411. 7 0.24 Very Good I VVS1 62.3 57 336 3.95 3.98 2.47 410. 8 0.26 Very Good H SI1 61.9 55 337 4.07 4.11 2.53 399. 9 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49 435. 10 0.23 Very Good H VS1 59.4 61 338 4 4.05 2.39 424. # … with 53,930 more rows |
new列が無事に追加できました.
値も想定どおりですね.
こんな感じで
元データをいじって,新たなベクトルを作成してそれを追加する
ということがmutateを使うと簡単にできます!!
4.条件ごとの列追加
実務では,条件ごとに処理を変えたいことが頻発します.
例えば,
この列の数値が10以上だったら処理1を,10未満だったら処理2を実施する.
みたいな感じです.
これもmutateを使用するとスッキリ書くことができます.
単数条件と複数条件の場合で書き方が違うので,両方とも見ていきましょう.
※ちなみに単数条件ってのは1つの条件で複数条件ってのは2つ以上の条件のことを言っています.
言葉だとよくわからないかもしれないので,具体例を見てみましょう.
今回は,diamondsのcolor列の値によって,処理を変えてみましょう.
color列は,7種類(E,I,J,H,F,G,D)のいずれかが入っています.
※ちなみにこれは,distinctという関数を使用することで確認できます.
1 2 3 |
# color列の重複を取り除く diamonds %>% distinct(color) |
1 2 3 4 5 6 7 8 9 10 |
# A tibble: 7 x 1 color <ord> 1 E 2 I 3 J 4 H 5 F 6 G 7 D |
4.1.単数条件 if_else
さて,まずは単数条件から見ていきましょう.
単数条件は,if_else関数を使うと簡潔に書くことができます.
if_else関数のイメージはこんな感じです.
具体例として, 新しい列をnew列とし,
color列が"E" ⇒ "E"をnew列に追加
それ以外 ⇒ "not E"をnew列に追加
という処理を実施してみましょう.
1 2 3 4 5 6 7 8 9 10 |
# color列が"E" ⇒ "E"をnew列に追加, それ以外 ⇒ "not E"をnew列に追加 diamonds %>% mutate( new = if_else( color == "E", "E", "not_E" ) ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# A tibble: 53,940 x 11 carat cut color clarity depth table price x y z new <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <chr> 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43 E 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31 E 3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31 E 4 0.290 Premium I VS2 62.4 58 334 4.2 4.23 2.63 not_E 5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75 not_E 6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48 not_E 7 0.24 Very Good I VVS1 62.3 57 336 3.95 3.98 2.47 not_E 8 0.26 Very Good H SI1 61.9 55 337 4.07 4.11 2.53 not_E 9 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49 E 10 0.23 Very Good H VS1 59.4 61 338 4 4.05 2.39 not_E # … with 53,930 more rows |
お見事!
見事に一番右端にnew列が追加されています.
こんな感じで単数条件の場合は,if_else関数を使うと,条件ごとに処理を分岐させることができるのです.
4.2.複数条件 case_when
単数条件については,if_else関数を使用すればいいと上で書きました.
それでは,複数条件の場合はどのように書くのでしょうか?
if_elseを複数回使用しても書けるですが,case_when関数を使用するともっときれいに書くことができます.
case_when関数のイメージはこんな感じ.
if_elseと比べると条件が増えているのがわかります.
具体例として,新しい列をnew列とし,
color列が"E" ⇒ "E"をnew列に追加
color列が"I" ⇒ "I"をnew列に追加
それ以外 ⇒ "not_E"をnew列に追加
という処理を実施してみましょう.
1 2 3 4 5 6 7 8 9 10 |
# color列が"E" ⇒ "E"をnew列に追加,color列が"I" ⇒ "I"をnew列に追加,それ以外 ⇒ "not_E_I"をnew列に追加 diamonds %>% mutate( new = case_when( color == "E" ~ "E", color == "I" ~ "I", TRUE ~ "not_E_I" ) ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# A tibble: 53,940 x 11 carat cut color clarity depth table price x y z new <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <chr> 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43 E 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31 E 3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31 E 4 0.290 Premium I VS2 62.4 58 334 4.2 4.23 2.63 I 5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75 not_E_I 6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48 not_E_I 7 0.24 Very Good I VVS1 62.3 57 336 3.95 3.98 2.47 I 8 0.26 Very Good H SI1 61.9 55 337 4.07 4.11 2.53 not_E_I 9 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49 E 10 0.23 Very Good H VS1 59.4 61 338 4 4.05 2.39 not_E_I # … with 53,930 more rows |
ちゃんと右側にnew列ができていますね,めでたしめでたし!
まとめ
今回はmutateについて,学習しました.
- mutateを使えば,列を追加することができる.
- 条件ごとに処理を変更させたい場合は,if_else(単数条件)やcase_when(複数条件)を使うと簡潔に書ける.
こんなところですかね.
mutateを使いこなせるとすごく便利ですよ.
ぜひいろいろ試してみてくださいね!!
それじゃ,お疲れ様でした!!