mapplyはもう使わなくてもよい?
TokyoR#40に参加して思い出したdplyrの話
あっ, どーも僕です。
都民なったといいうことで, TokyoRに参加してみました。
その中で, dplyrの使い方を思い出したので久しぶりにブログを更新します。
複数の引数を持つ関数
変数が複数あって, その変数を変えながら関数を利用したいときに, Rらしい書き方とはどのようなものでしょう?
もちろんfor文でできますが, Rらしいとなると, ぱっと思い浮かぶのはmapplyだと思います.
helpにも載っているよく見る例は次のような使い方です. rep関数を用いて, 1を4個, 2を3個, 3を2個, 4を1個を出したいというものです.
# mapply mapply(rep, 1:4, 4:1) [[1]] [1] 1 1 1 1 [[2]] [1] 2 2 2 [[3]] [1] 3 3 [[4]] [1] 4
これは, これで良いのですがmapplyは二ヶ月後の自分が読み返せないということが欠点だと思います.
ということで, 自分は一年くらい前から前述と似たような処理に関しては, foreachパッケージを利用していました.
# foreach library (foreach) foreach(i = 1:4, j = 4:1) %do% {rep (i, j)} [[1]] [1] 1 1 1 1 [[2]] [1] 2 2 2 [[3]] [1] 3 3 [[4]] [1] 4
わかりやすいですね。基本は, これでよいと思います.
で, 本題としては先日大幅アップデートしたdplyrパッケージにおいて, do関数の返し値がリストを要素としたデータフレームで返すようになったため, 上記のような処理が楽にできるようになったのです。
# dplyr library (dplyr) para <- data.frame (val = 1:4, len = 4:1) rtn <- para %>% rowwise() %>% do (repVal = rep (.$val, .$len)) rtn$repVal [[1]] [1] 1 1 1 1 [[2]] [1] 2 2 2 [[3]] [1] 3 3 [[4]] [1] 4
全く同じ結果の処理が複数あるどれがいいのか迷いますね. Rの難しいところです.
mapplyはお役御免?
でわ, mapplyはお役御免でしょうか.
そうはいかないと思います.
mapplyを使ったことある人はわかるかと思いますが, やっぱりmapplyを使いたくなる場面があるのが正直なところです....