88  mutate()の実践

それでは新しい列を作る関数、mutateを実際に利用していきましょう。

いきなり演習です!

1つ前の動画でスライドでご提示した表を作成して、新しい列を足すこと、できますか?

もとの表     できあがった表

|col1|col2|  |col1|col2|new|
|----|----|  |----|----|---|
|1   |10  |  |1   |10  |11 |
|2   |20  |  |2   |20  |22 |
|3   |30  |  |3   |30  |33 |
|4   |40  |  |4   |40  |44 |
|----|----|  |----|----|---|

できましたか?

やってみましょう。

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.2     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.0
✔ ggplot2   3.4.2     ✔ tibble    3.2.1
✔ lubridate 1.9.2     ✔ tidyr     1.3.0
✔ purrr     1.0.1     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
hyou <- tibble(
  col1=c(1,2,3,4), 
  col2=c(10,20,30,40)
)

hyou
# A tibble: 4 × 2
   col1  col2
  <dbl> <dbl>
1     1    10
2     2    20
3     3    30
4     4    40
hyou %>% mutate(new = col1 + col2)
# A tibble: 4 × 3
   col1  col2   new
  <dbl> <dbl> <dbl>
1     1    10    11
2     2    20    22
3     3    30    33
4     4    40    44

できましたね?

予測変換にもちゃんと列名がでてきていましたね?

このように列を作るのはmutate関数で簡単にできます。

hyou
# A tibble: 4 × 2
   col1  col2
  <dbl> <dbl>
1     1    10
2     2    20
3     3    30
4     4    40

ただし、忘れてはいけないのが、mutate関数は「列を作る」機能しかないので、代入してあげないとこのように折角作成した列が反映されていません。

hyou <- hyou %>% mutate(new = col1 + col2)
hyou
# A tibble: 4 × 3
   col1  col2   new
  <dbl> <dbl> <dbl>
1     1    10    11
2     2    20    22
3     3    30    33
4     4    40    44

mutateの動作を色々と確認しておきましょう。

hyou %>% 
  mutate(test = 1)
# A tibble: 4 × 4
   col1  col2   new  test
  <dbl> <dbl> <dbl> <dbl>
1     1    10    11     1
2     2    20    22     1
3     3    30    33     1
4     4    40    44     1

このように、長さが1のベクトルを入れると、自動的に複製されて、列ができあがります。

hyou %>% 
  mutate(test = c(1,2))
Error in `mutate()`:
ℹ In argument: `test = c(1, 2)`.
Caused by error:
! `test` must be size 4 or 1, not 2.

ただし、ベクトルの長さが表の行の長さと一致しない場合は、このようにエラーが生じるので、長さがぴったり か、 1 である必要があります。

また、mutateは1列だけでなく、同時に複数の列をつくることも可能です。

hyou %>% 
  mutate(
    n1 = col1 + col2,
    n2 = col1 - col2,
    n3 = col1 * col2
  )
# A tibble: 4 × 6
   col1  col2   new    n1    n2    n3
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1     1    10    11    11    -9    10
2     2    20    22    22   -18    40
3     3    30    33    33   -27    90
4     4    40    44    44   -36   160

他にも、複数列を作成するときに、同じmutateの中で新たに「先に作成した列」を呼び出すことも可能です

hyou %>% 
  mutate(
    n4 = col1 + col2,
    n5 = n4 * col2
  )
# A tibble: 4 × 5
   col1  col2   new    n4    n5
  <dbl> <dbl> <dbl> <dbl> <dbl>
1     1    10    11    11   110
2     2    20    22    22   440
3     3    30    33    33   990
4     4    40    44    44  1760

これは、後に作成したものは呼べないので注意が必要です

hyou %>% 
  mutate(
    n5 = n4 *col2,
    n4 = col1 + col2
  )
Error in `mutate()`:
ℹ In argument: `n5 = n4 * col2`.
Caused by error:
! object 'n4' not found

以上、mutate関数の使い方の説明でした。このmutate関数、多分パイプに次いで多用する関数になるとおもいますので、是非、しっかりと動作を抑えておいてください。次の動画では練習問題とその解答です。