マルチアンサーの処理

Others
Author

Kentaro Kamada

Published

June 5, 2024

パッケージ

library(tidyverse)

Googleフォームなどのマルチアンサーの処理

googleフォームでマルチアンサー形式の設問を作ると、以下のようにカンマで区切られた形式でデータが入力される。

data <- 
  tibble(
    q1 = c('A,B,C', 'A,B', 'A,C', 'B,C', 'A', 'B', 'C'),
  ) |> 
  mutate(id = row_number()) |> 
  relocate(id, .before = q1) 

data
# A tibble: 7 × 2
     id q1   
  <int> <chr>
1     1 A,B,C
2     2 A,B  
3     3 A,C  
4     4 B,C  
5     5 A    
6     6 B    
7     7 C    

まずはカンマで区切られているやつを分割する。

data |> 
  separate_longer_delim(cols = q1, delim = ',') 
# A tibble: 12 × 2
      id q1   
   <int> <chr>
 1     1 A    
 2     1 B    
 3     1 C    
 4     2 A    
 5     2 B    
 6     3 A    
 7     3 C    
 8     4 B    
 9     4 C    
10     5 A    
11     6 B    
12     7 C    

このデータの意味自体は、id:1はA,B,Cを選択した、というものである。

なのでフラグとして1を立てておく。

data |> 
  separate_longer_delim(cols = q1, delim = ',') |>
  mutate(flag = 1)
# A tibble: 12 × 3
      id q1     flag
   <int> <chr> <dbl>
 1     1 A         1
 2     1 B         1
 3     1 C         1
 4     2 A         1
 5     2 B         1
 6     3 A         1
 7     3 C         1
 8     4 B         1
 9     4 C         1
10     5 A         1
11     6 B         1
12     7 C         1

つぎにこれを横持ちに展開する。

data |> 
  separate_longer_delim(cols = q1, delim = ',') |>
  mutate(flag = 1) |> 
  pivot_wider(names_from = q1, values_from = flag)
# A tibble: 7 × 4
     id     A     B     C
  <int> <dbl> <dbl> <dbl>
1     1     1     1     1
2     2     1     1    NA
3     3     1    NA     1
4     4    NA     1     1
5     5     1    NA    NA
6     6    NA     1    NA
7     7    NA    NA     1

これで、A,B,Cの選択状況がわかるようになった。

非選択がNAになっているのは少々アレなので、0で埋めるようにする。

data |> 
  separate_longer_delim(cols = q1, delim = ',') |>
  mutate(flag = 1) |> 
  pivot_wider(names_from = q1, values_from = flag, values_fill = 0)
# A tibble: 7 × 4
     id     A     B     C
  <int> <dbl> <dbl> <dbl>
1     1     1     1     1
2     2     1     1     0
3     3     1     0     1
4     4     0     1     1
5     5     1     0     0
6     6     0     1     0
7     7     0     0     1

これでダミー変数に変換できた。

もともとの変数名であるq1が消えてしまっているので、それを残すにはnames_prefixを指定する。

data |> 
  separate_longer_delim(cols = q1, delim = ',') |>
  mutate(flag = 1) |> 
  pivot_wider(
    names_from = q1, 
    names_prefix = 'q1_', 
    values_from = flag, 
    values_fill = 0
  ) 
# A tibble: 7 × 4
     id  q1_A  q1_B  q1_C
  <int> <dbl> <dbl> <dbl>
1     1     1     1     1
2     2     1     1     0
3     3     1     0     1
4     4     0     1     1
5     5     1     0     0
6     6     0     1     0
7     7     0     0     1