2010年9月1日水曜日

グループごとに複数の統計量を返す方法の検討

以前紹介したaggregate関数はグループごとにスカラー値を返す
関数をオプション(FUN)に指定するが、分位点を求めるquantile関数のように、
複数の値を返す方法はないかと尋ねられたので、以下のコードを作成した。

set.seed(1234)
let <- sample(letters[1:2],100,rep=T) # lettersはa-zが入っている
letN <- paste(let,c(rep(1,50),rep(2,50)),sep="")
dat <- iris[1:100,1] # アヤメデータから借用

d <- data.frame(let,letN,dat) # データの作成

dsp <- split(d,list(paste(d$let,d$letN,sep="_")))
res <- lapply(dsp,function(x){return(quantile(x$dat))})

dはダミーデータである。
dspはdをsplitしたものであるが、list(paste(d$let,d$letN,sep="_"))
ごとに区切るようにしている。この表現は何をキーにしてリストごとに分けるか
ということを指定しているのであるが、list(d$let,d$letN)では、
直積でリストを作成してしまうので、それを避けるために特殊な切り方にしている。

例えば1列目にはa,bという要素があり、2列目にはa1,a2,b1,b2という要素があるので、
リストは1,2列目の要素が
(a,a1),(a,a2),(a,b1),(a,b2),(b,a1),(b,a2),(b,b1),(b,b2)
となるように分けようとする。

しかしながら実際に1列目がa,2列目がb1という要素が無くても、
空のデータフレームからなるリストを作成しようとするので、それを嫌がって、
空のデータフレームが生成されるのを防いでいるのである。

最後の行にあるlapplyでdspに適用する関数は、無名関数と呼ばれるものを利用している。
通常の関数はmyfunc <- function(x) { ... } という形式が一般的であるが、
myfuncという関数名に相当する部分がなく、関数の定義のみで
記述されていることから無名関数と呼ばれている。
機能を何か所も使いまわすことがなく、かつ短い記述で済む場合に用いると
便利だと思われる機能である。

0 件のコメント:

コメントを投稿

フォロワー

ページビューの合計