数値シミュレーションの結果を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で並列化してくれた。感謝感謝。