178  group_byの効果の確認(sld70)

library(tidyverse)

ひとつ前と二つ前の動画ではgroup_by関数についての イメージを作るための解説を実施してきました。

ここからは、group_by関数のR上での動きについてその動作を確認していきましょう。

まず、改めて、スライドで解説したデータを生成します

id <- 1:15

age <- c(30,40,65,34,86,
         43,64,26,87,45,
         76,24,97,45,34)

gender <- c("f","m","f","f","f",
            "m","m","f","f","m",
            "f","f","m","m","m")

isx <- c(F,T,F,F,T,
         T,T,F,T,F,
         T,F,F,F,T)

dat <- tibble(id     = id    , age = age, 
              gender = gender, isx = isx)

このデータを利用して、まずは、グループに分ける処理を行います。

dat %>% 
  group_by(isx)
# A tibble: 15 × 4
# Groups:   isx [2]
      id   age gender isx  
   <int> <dbl> <chr>  <lgl>
 1     1    30 f      FALSE
 2     2    40 m      TRUE 
 3     3    65 f      FALSE
 4     4    34 f      FALSE
 5     5    86 f      TRUE 
 6     6    43 m      TRUE 
 7     7    64 m      TRUE 
 8     8    26 f      FALSE
 9     9    87 f      TRUE 
10    10    45 m      FALSE
11    11    76 f      TRUE 
12    12    24 f      FALSE
13    13    97 m      FALSE
14    14    45 m      FALSE
15    15    34 m      TRUE 

実行結果は特に普段と変わらなさそうですが、

Groups: isx[2]

という表記がコンソール画面にでていることに気づきましたか?

tible形式では、グループ化されたデータを印字するとこのように、どのようなグループ分け(スライドでいう赤い線)が引かれているかを明記してくれます。

では、group_by関数が本当に働いているのか、ちょっと実験してみましょう。次の二つのスクリプトの実行結果がどのように変わるか、予測できますか?

dat %>% 
  mutate(new = length(isx))
# A tibble: 15 × 5
      id   age gender isx     new
   <int> <dbl> <chr>  <lgl> <int>
 1     1    30 f      FALSE    15
 2     2    40 m      TRUE     15
 3     3    65 f      FALSE    15
 4     4    34 f      FALSE    15
 5     5    86 f      TRUE     15
 6     6    43 m      TRUE     15
 7     7    64 m      TRUE     15
 8     8    26 f      FALSE    15
 9     9    87 f      TRUE     15
10    10    45 m      FALSE    15
11    11    76 f      TRUE     15
12    12    24 f      FALSE    15
13    13    97 m      FALSE    15
14    14    45 m      FALSE    15
15    15    34 m      TRUE     15
dat %>% 
  group_by(isx) %>% 
  mutate(new = length(isx))
# A tibble: 15 × 5
# Groups:   isx [2]
      id   age gender isx     new
   <int> <dbl> <chr>  <lgl> <int>
 1     1    30 f      FALSE     8
 2     2    40 m      TRUE      7
 3     3    65 f      FALSE     8
 4     4    34 f      FALSE     8
 5     5    86 f      TRUE      7
 6     6    43 m      TRUE      7
 7     7    64 m      TRUE      7
 8     8    26 f      FALSE     8
 9     9    87 f      TRUE      7
10    10    45 m      FALSE     8
11    11    76 f      TRUE      7
12    12    24 f      FALSE     8
13    13    97 m      FALSE     8
14    14    45 m      FALSE     8
15    15    34 m      TRUE      7

group_byを挟まない場合は、length(isx)は15個なので、

newという新しい変数の中には15という数字が入っています。

ところが、group_byを間にかませると、newは、isxの値がTRUEだと7、FALSEだと8 という数字になっています

このように、group_byを入れることで仮想の赤い線/データが仮に区切られている

という状況が作り出されたことが確認できました。

それでは、次の動画に進む前に、年齢、性別をisx毎に

を計算するスクリプトを書いてみてください。