関数をオプション(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 件のコメント:
コメントを投稿