読者です 読者をやめる 読者になる 読者になる

自分用メモ:dplyrとかtidyrで要素がネストできたりできなかったり

この記事を読んでて思ったけど、そもそもdplyrとかtidyrは要素がネストするのを許したり許さなかったりするんだろう。

dplyrでgroup_byしてグループ内でテキストにpaste的な事をする。 | 分析のおはなし。

たとえばtidyrにはnest()という関数があって、いとも簡単にネストしたtbl_dfをつくれる。

d <-
  data.frame(
    colA = c("a",     "b",      "b",        "c"        ),
    colB = c("apple", "banana", "blueberry","cranberry"),
    stringsAsFactors = FALSE
  )

d %>%
  nest(colB)
#> Source: local data frame [3 x 2]
#> Groups: <by row>
#> 
#>    colA     colB
#>   (chr)   (list)
#> 1     a <chr[1]>
#> 2     b <chr[2]>
#> 3     c <chr[1]>

dplyrも、rowwiseを使うとそういうのがつくれる。

data.frame(a = 1:3, b = letters[1:3], stringsAsFactors = FALSE) %>%
  rowwise() %>%
  do(x = rep(.$b, .$a))
#> Source: local data frame [3 x 1]
#> Groups: <by row>
#> 
#>          x
#>     (list)
#> 1 <chr[1]>
#> 2 <chr[2]>
#> 3 <chr[3]>

あとは、summarise()するときにlist()でラップしても同じ結果になる。

d %>%
  group_by(colA) %>%
  summarise(colB = list(colB))
#> Source: local data frame [3 x 2]
#> 
#>    colA     colB
#>   (chr)   (list)
#> 1     a <chr[1]>
#> 2     b <chr[2]>
#> 3     c <chr[1]>

たしかに、最終的にひとつのセルにひとつの値しか入ってないことを要求するとしても、処理の中間ではこういう値の持ち方をできたほうが便利なのかもしれない。

でも、だったらgroup_by()してるんだからそこはエラーにせず察してくれーっていう感じがする。listでラップしなくても上の結果を得られてもいいのでは。

d %>%
  group_by(colA) %>%
  summarise(colB)
#> Error: expecting a single value

その辺の哲学がいまいち分からない...