数値シミュレーションの結果をlistで受けてからのrbind_allで捌いて可視化するのが俺のデファクトスタンダード

例えば、二次元のランダムウォークシミュレーションの結果を返す関数を作る。

randomwalk2D <- function(){cbind(x=cumsum(rnorm(100)), y=cumsum(rnorm(100)))}

これはまぁ、二次元平面上にプロットすると原点(0,0)を始点とする二次元のランダムウォークになる。

library(dplyr)
randomwalk2D() %>% plot(type="l")

最近はこの手の数値シミュレーション結果を複数回走らせた結果を捌く場合、

  • 一旦リストで受けておいて、その結果をdata.frameにdplyrパッケージのrbind_all関数を使ってdata.frameに倒してから可視化なりする

ってのが、主に俺の中でのデファクトスタンダードになっている。例えば以下のように書くということだ。

library(dplyr)
res <- list()
for(i in 1:10)
{
  res[[length(res)+1]] <- data.frame(randomwalk2D(), group=LETTERS[i])
}
df <- res %>% rbind_all 

あぁ、こう書かなくても

df <- lapply(1:10, function(i)data.frame(randomwalk2D(), group=LETTERS[i])) %>% rbind_all

の方が楽でいいか。

この結果、各数値シミュレーション(ここでは二次元ランダムウォーク)の結果がアルファベットで区別されて、以下のようなdata.frameとして出力される。

> head(df)
           x         y group
1  0.3718975 0.9598459     A
2 -2.0962722 1.1514429     A
3 -2.5984220 2.0756806     A
4 -1.7751281 1.0325865     A
5 -1.4004595 0.6961468     A
6 -2.3383467 1.0103687     A

これはおもにggplot2で可視化し易くて

ggplot(df, aes(x=x, y=y)) + 
  geom_path( aes(color=group)) +
  geom_point(aes(color=group), size=3)


となって、ビューチフルだなと。もっといいやり方があっても良さそうだが、今んとこの俺俺デファクトスタンダードである。

追記
「スキあらば並列計算をするおじさん」が現れてコードをforeachで並列化してくれた。感謝感謝。