dplyr 0.4.3を使ってみる

最近、パッケージ紹介といえばからだにいいものさんの活躍っぷりがすごいので、私はもうこういうの書かなくていいかなあ...なんて思いながら羽鳥がなんかつぶやいてたのでdplyrの次期バージョンを軽く触ってみて気になるとこだけメモしときます。

参考

元のNEWSファイルはここ。

dplyr/NEWS.md at master · hadley/dplyr · GitHub

文字コードまわりの改善

Until now, dplyr's support for non-UTF8 encodings has been rather shaky. This release brings a number of improvement to fix these problems: it's probably not perfect, but should be a lot better than the previously version.

ということで、文字コード周りの細かなバグがちょこちょこ直っているらしいです。これでかの有名なWhy Are You Using SJIS問題にも終止符が打たれるのかも??(いや、元の問題を理解できてないので全然わかりません…すみません)。

それはそれとして、↓これとかはロケールによっては文字の順番が一意に定まらないという問題らしいんですが、なんとなく深い闇を垣間見ている気がします。コワイ。

Unicode numbers · Issue #1315 · hadley/dplyr · GitHub

frame_data()

add 'frame_data() (#804) by kevinushey · Pull Request #1358 · hadley/dplyr · GitHub

たぶん今回追加された関数はこれだけ? 行方向にデータフレームをつくる関数らしいです。あんまり使うことはなさそう。

frame_data(
    ~colA, ~colB,
    "a", 1,
    "b", 2
)
#> Source: local data frame [2 x 2]
#> 
#>    colA  colB
#>   (chr) (dbl)
#> 1     a     1
#> 2     b     2

そうそう、この(chr)とか(dbp)とか、列のデータ型が表示されるようになりましたね。これも細かな改善。

added option `show_classes` for `print.tbl_df` by w9 · Pull Request #1276 · hadley/dplyr · GitHub

bind_rows()bind_cols()がlistにも使えるようになった

bind_rows(): accept lists? · Issue #1104 · hadley/dplyr · GitHub

これまで、bind_rows()に渡すのはいったんdata.frameに変換してからでないとダメでしたが、listをそのまま渡しても大丈夫になりました。

list(list(x = 1, y = 'a'), list(x = 2, y = 'b')) %>%
  bind_rows
#> Source: local data frame [2 x 2]
#> 
#>       x     y
#>   (dbl) (chr)
#> 1     1     a
#> 2     2     b

bind_rows().idを指定できるようになった

Add .id argument to bind_rows by lionel- · Pull Request #825 · hadley/dplyr · GitHub

これまで、bind_rows()をすると、それぞれの列がどのオブジェクトから来たか、という情報が完全に失われてしまっていました。

つまり、

type_A <- data.frame(value = c(1,2,3), error = c(0.1, 0.2, 0.1))
type_B <- data.frame(value = c(2,2,4), error = c(0.4, 0.4, 0.1))

みたいなデータがあるときに、ふつうにbind_rows()すると、どれがtype Aだかtype Bだか分からなくなってしまっていました。

bind_rows(type_A, type_B)
#> Source: local data frame [6 x 2]
#> 
#>   value error
#>   (dbl) (dbl)
#> 1     1   0.1
#> 2     2   0.2
#> 3     3   0.1
#> 4     2   0.4
#> 5     2   0.4
#> 6     4   0.1

これが、.id引数を指定すると、区別することができるようになります。書き方は何種類かあります。

bind_rows(type_A, type_B, .id = "id")
#> Source: local data frame [6 x 3]
#> 
#>      id value error
#>   (chr) (dbl) (dbl)
#> 1     1     1   0.1
#> 2     1     2   0.2
#> 3     1     3   0.1
#> 4     2     2   0.4
#> 5     2     2   0.4
#> 6     2     4   0.1

bind_rows(A = type_A, B = type_B, .id = "type")
#> Source: local data frame [6 x 3]
#> 
#>    type value error
#>   (chr) (dbl) (dbl)
#> 1     A     1   0.1
#> 2     A     2   0.2
#> 3     A     3   0.1
#> 4     B     2   0.4
#> 5     B     2   0.4
#> 6     B     4   0.1

hybrid evaluation

summarize dropping attributes of columns · Issue #1237 · hadley/dplyr · GitHub

[BUG?] filter() throws error after group_by() %>% do() · Issue #1134 · hadley/dplyr · GitHub

なんすかそれ。しらない…。

と思ってぐぐると、6月ごろにこんなVignetteができていました。そういえばちらっと読んでまったく理解できずにスルーした記憶がおぼろげに…

https://cran.r-project.org/web/packages/dplyr/vignettes/hybrid-evaluation.html

どなたか解説記事よろしくお願いします!(丸投げ)

感想

引き続きバグフィックスという印象ですが、文字コードとかリスト周りの改善にはちょっと希望が持てる感じです。バージョン0.5が待ち遠しいです。