166  データの作成

それではRで集計を行っていきましょう。スライドでお示しした通り、集計とは、ベクトル(数字や文字列、因子などの要素)の特徴を何かしらの代表的な値にまとめることになります

Rでこれを実施するためには、やりたい集計に応じた関数を知っておく必要がありますとりあえず、

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
dat <- tibble(
  num = c(1  ,2  ,3  ,4  ,5  ,6  ,7  ,8  ,9  ,10),
  fac2 =c("a","b","a","b","a","b","a","b","a","b") %>% as.factor(),
  fac3 =c("A","B","C","A","B","C","A","B","C","A") %>% as.factor()
)

dat
# A tibble: 10 × 3
     num fac2  fac3 
   <dbl> <fct> <fct>
 1     1 a     A    
 2     2 b     B    
 3     3 a     C    
 4     4 b     A    
 5     5 a     B    
 6     6 b     C    
 7     7 a     A    
 8     8 b     B    
 9     9 a     C    
10    10 b     A    

こんな感じのtibbleを集計していくことを考えましょう

となります。

ちなみに、繰り返しを簡単にできるrepという関数を利利すると

rep( c("a","b"), 4)
[1] "a" "b" "a" "b" "a" "b" "a" "b"

という感じで、最初に与えた要素、次に与えた数字の数だけくりかえしたベクトルを返してくれるので、上のdatは、

dat <- tibble(
  num = 1:10,
  fac2 = rep(c("a","b"), 5),
  fac3 = rep(c("A","B","C"), 4)[1:10]
)

dat
# A tibble: 10 × 3
     num fac2  fac3 
   <int> <chr> <chr>
 1     1 a     A    
 2     2 b     B    
 3     3 a     C    
 4     4 b     A    
 5     5 a     B    
 6     6 b     C    
 7     7 a     A    
 8     8 b     B    
 9     9 a     C    
10    10 b     A    

とも書けます。fac3で[1:10]としているのは

tibble(num  = 1:3, 
       test = c("a","b","c","a","b","c"))
Error in `tibble()`:
! Tibble columns must have compatible sizes.
• Size 3: Existing data.
• Size 6: Column `test`.
ℹ Only values of size one are recycled.

このように、tibble内では、すべて同じ長さの要素を与えないとエラーが生じるので、

tibble(num  = 1:3, 
       test = c("a","b","c","a","b","c")[1:3] )
# A tibble: 3 × 2
    num test 
  <int> <chr>
1     1 a    
2     2 b    
3     3 c    

ようそをnumの数と同じだけにするためのものです。repを使うと与えた要素の長さの倍数の長さにしかならないので、この[]は地味に大切です。

100行で同様のパターンのものを作りたければ

dat <- tibble(
  num = 1:100,
  fac2 = rep(c("a","b"), 50),
  fac3 = rep(c("A","B","C"), 100)[1:100] 
)

dat
# A tibble: 100 × 3
     num fac2  fac3 
   <int> <chr> <chr>
 1     1 a     A    
 2     2 b     B    
 3     3 a     C    
 4     4 b     A    
 5     5 a     B    
 6     6 b     C    
 7     7 a     A    
 8     8 b     B    
 9     9 a     C    
10    10 b     A    
# ℹ 90 more rows

(本当はfac3繰り返し回数は34が最適ですが、計算するのが面倒なので全部100としています)

ですし、X行のものを作る関数にしたければ、

genXrow <- function(X){
  tibble(
    num = 1:X,
    fac2 = rep(c("a","b")    , X)[1:X],
    fac3 = rep(c("A","B","C"), X)[1:X]
  )
}

dat <- genXrow(11)
dat
# A tibble: 11 × 3
     num fac2  fac3 
   <int> <chr> <chr>
 1     1 a     A    
 2     2 b     B    
 3     3 a     C    
 4     4 b     A    
 5     5 a     B    
 6     6 b     C    
 7     7 a     A    
 8     8 b     B    
 9     9 a     C    
10    10 b     A    
11    11 a     B    
genXrow(10000)
# A tibble: 10,000 × 3
     num fac2  fac3 
   <int> <chr> <chr>
 1     1 a     A    
 2     2 b     B    
 3     3 a     C    
 4     4 b     A    
 5     5 a     B    
 6     6 b     C    
 7     7 a     A    
 8     8 b     B    
 9     9 a     C    
10    10 b     A    
# ℹ 9,990 more rows

となります

余談でした。

こういう風に、データを自分で作れるようになると色々な関数や統計的なことを勉強する際に自分で仕組みがわかっているデータを作成できるのでおすすめです。

それでは、次に、集計用の関数の解説をおこなっていきましょう