Tidyverses初心者がnestedデータを、key項目を名前にしたリスト形式に変換する

#ちょっとハマったので、備忘録がてら書いておく。

##参考
https://purrr.tidyverse.org/reference/flatten.html

https://heavywatal.github.io/rstats/tidyr.html

https://suryu.me/post/r_advent_calendar_day3/


##問題
GOseqなどのRパッケージでは名前付きのlist形式のデータを要求してくるが、
Tidyに作ったデータを、最後にlistにして渡す形にしたい。

お作法的にはnestを使うことになるはずだが、
nestしたデータをkey項目を名前としたリストに変換する方法がすぐにはわからなかった。

##解決法
以下のようにするとできる。

```R
library(tidyverse)

My_Tidy_Data_Nested <-
  My_Tidy_Data %>% 
  group_by(MyKey) %>% 
  nest() 

My_List <-purrr::flatten(My_Tidy_Data_Nested$data)

names(My_List) <- My_Tidy_Data_Nested$MyKey

```

My_Tidy_Data_Nested$data で出るデータはtibbleをlistにした形式になっているので
purrr::flatten　で１段階解消して、名無しの複数のlistデータに変える
そのあと　names(My_List)　で MyKeyを使って名付けしていく。


##詳細な使用例

```R
library(tidyverse)


####irisを例にして、まずデータをtibble化して簡略化
My_Tidy_Data <-
  iris %>% 
  tibble::as_tibble() %>% 
  dplyr::select(Species, Sepal.Length) 

My_Tidy_Data

> My_Tidy_Data
# A tibble: 150 x 2
   Species Sepal.Length
   <fct>          <dbl>
 1 setosa           5.1
 2 setosa           4.9
 3 setosa           4.7
 4 setosa           4.6
 5 setosa           5  
 6 setosa           5.4
 7 setosa           4.6
 8 setosa           5  
 9 setosa           4.4
10 setosa           4.9
# ... with 140 more rows

####species をkeyにしてnest化する

My_Tidy_Data_Nested <- 
  My_Tidy_Data %>%
  group_by(Species) %>% 
  nest() 

> My_Tidy_Data_Nested
# A tibble: 3 x 2
  Species    data             
  <fct>      <list>           
1 setosa     <tibble [50 × 1]>
2 versicolor <tibble [50 × 1]>
3 virginica  <tibble [50 × 1]>


####nest化されたdataにアクセスする

My_Tidy_Data_Nested$data


####　# A tibble: 50 x 1　を３つ持つリストになっている。

class(My_Tidy_Data_Nested$data)
>class(My_Tidy_Data_Nested$data)
[1] "list"

class(My_Tidy_Data_Nested$data[[1]])
> class(My_Tidy_Data_Nested$data[[1]])
[1] "tbl_df"     "tbl"        "data.frame"


> My_Tidy_Data_Nested$data
[[1]]
# A tibble: 50 x 1
   Sepal.Length
          <dbl>
 1          5.1
 2          4.9
 3          4.7
 4          4.6
 5          5  
 6          5.4
 7          4.6
 8          5  
 9          4.4
10          4.9
# ... with 40 more rows

[[2]]
# A tibble: 50 x 1
   Sepal.Length
          <dbl>
 1          7  
 2          6.4
 3          6.9
 4          5.5
 5          6.5
 6          5.7
 7          6.3
 8          4.9
 9          6.6
10          5.2
# ... with 40 more rows

[[3]]
# A tibble: 50 x 1
   Sepal.Length
          <dbl>
 1          6.3
 2          5.8
 3          7.1
 4          6.3
 5          6.5
 6          7.6
 7          4.9
 8          7.3
 9          6.7
10          7.2
# ... with 40 more rows

####これに名前をつけてもだめ

names(My_Tidy_Data_Nested$data) <- My_Tidy_Data_Nested$Species


My_Tidy_Data_Nested$data

>My_Tidy_Data_Nested$data
$setosa
# A tibble: 50 x 1
   Sepal.Length
          <dbl>
 1          5.1
 2          4.9
 3          4.7
 4          4.6
 5          5  
 6          5.4
 7          4.6
 8          5  
 9          4.4
10          4.9
# ... with 40 more rows

$versicolor
# A tibble: 50 x 1
   Sepal.Length
          <dbl>
 1          7  
 2          6.4
 3          6.9
 4          5.5
 5          6.5
 6          5.7
 7          6.3
 8          4.9
 9          6.6
10          5.2
# ... with 40 more rows

$virginica
# A tibble: 50 x 1
   Sepal.Length
          <dbl>
 1          6.3
 2          5.8
 3          7.1
 4          6.3
 5          6.5
 6          7.6
 7          4.9
 8          7.3
 9          6.7
10          7.2
# ... with 40 more rows


####purrr::flatten は　「リストのリスト」　を「リスト」にしてくれる

My_List <-purrr::flatten(My_Tidy_Data_Nested$data)

> My_List
$Sepal.Length
 [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0
[27] 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0

$Sepal.Length
 [1] 7.0 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6
[27] 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7

$Sepal.Length
 [1] 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2
[27] 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9


####あとは名前を変えればいい。
names(My_List) <- My_Tidy_Data_Nested$Species

> My_List
$setosa
 [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0
[27] 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0

$versicolor
 [1] 7.0 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6
[27] 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7

$virginica
 [1] 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2
[27] 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9

```