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

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を使いたくなる場面があるのが正直なところです....