裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

いろんなことをしてくれる関数が山ほどあるが...

2013年01月07日 | ブログラミング

reshape2 でデータ整形」に書いてあることについてなのだが

library(reshape2)
aq.m <- melt(airquality, id=c("Month", "Day"), na.rm=TRUE)
dcast(aq.m, Month ~ variable, mean)

によって

  Month    Ozone  Solar.R      Wind     Temp
1     5 23.61538 181.2963 11.622581 65.54839
2     6 29.44444 190.1667 10.266667 79.10000
3     7 59.11538 216.4839  8.941935 83.90323
4     8 59.96154 171.8571  8.793548 83.96774
5     9 31.44828 167.4333 10.180000 76.90000

更に,続いて,

library(plyr)
dcast(aq.m, Month~variable, mean, subset=.(variable=="Ozone"))

により

  Month    Ozone
1     5 23.61538
2     6 29.44444
3     7 59.11538
4     8 59.96154
5     9 31.44828

が得られると。

しかし考えても見よう,これくらいのことをするのに何故新たなパッケージを使わなければならないのか

aggregate 1 つで十分だ。長いって?複雑だって?そんなこたぁねぇなぁ~~~。

> aggregate(airquality[,1:4], by=airquality["Month"], mean, na.rm=TRUE)
  Month    Ozone  Solar.R      Wind     Temp
1     5 23.61538 181.2963 11.622581 65.54839
2     6 29.44444 190.1667 10.266667 79.10000
3     7 59.11538 216.4839  8.941935 83.90323
4     8 59.96154 171.8571  8.793548 83.96774
5     9 31.44828 167.4333 10.180000 76.90000
> aggregate(airquality["Ozone"], by=airquality["Month"], mean, na.rm=TRUE)
  Month    Ozone
1     5 23.61538

2     6 29.44444
3     7 59.11538
4     8 59.96154
5     9 31.44828

コメント (1)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ダメ出し:道具を作る場合には

2013年01月07日 | ブログラミング

全ての変数の分布を箱ひげ図にする」に書かれていることについて

提示されているプログラムは,作者本人も認めていること以外にもいろいろ不都合がある

道具は,とにかく「汎用的でなくてはならない」

そのためには,特定の状況を仮定したものではダメ。例えば,分析に使うデータフレーム名や,列数,列の構成を一般的なものではだめだというのは「いろはのい」。iris[,i] なんてのがでてきてはだめ。その対処は簡単で,関数にすればよいのだ。関数にするだけで,関数にするにはどうしなければならないかの対処をするだけで(それが難しいかも知れないが),自ずと汎用的な道具ができる。

そのほかにもいろいろあるが,あれこれ書くより,プログラム例を挙げる方が速い。どこがどう違うかは,みればわかる(ただし,真意が伝わらない部分もあるだろうが)。

boxplot2 <- function(d, g, nr=2, nc=2, width=500, height=400) {
    m <- ncol(d)
    png("fig%03i.png", width=width, height=height)
    layout(matrix(1:(nr*nc), nr, nc, byrow=TRUE))
    for (i in seq_len(m)) {
        boxplot(d[, i] ~ g, main = names(d)[i])
    }
    layout(1)
    dev.off()
}

boxplot2(iris[, 1:4], iris[, 5], nc=1)

boxplot2 関数の第 1 引数は,箱ひげ図を描く変数だけを含むデータフレーム。飛び飛びの列もちゃんと指定できる。

第 2 引数は,グループを表すベクトル。通常は,対象とするデータフレームの一つの列を指定する。

第 3,4 引数は,一つのファイルに何行何列の図を描くかを指定する。nr*nc が第 1 引数の列数の倍数である必要はない(最後のファイルには nr*nc 個未満の図が描かれるだけ)。

第 5,6 引数は,一つのファイルの画像サイズ(個々の箱ひげ図のサイズではない)。例では png を使ったが,pdf でもよい。それぞれ特徴があり,サイズの指定法も異なる場合がある。個人的には,pdf で onefile=TRUE がお勧めだ。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村