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毎に
- 年齢は平均、最小、最大、
- 性別は男性の数と全体に占める割合
を計算するスクリプトを書いてみてください。