apply系apply配列のデータに、ある一定の系列(margin)の要素に対して関数をかける。
Rの配列は多次元配列。なので、marginは2にとどまらない。
x <- 1:27 > dim(x) <- c(3,3,3) > apply(x,1,paste,collapse=",") [1] "1,4,7,10,13,16,19,22,25" "2,5,8,11,14,17,20,23,26" [3] "3,6,9,12,15,18,21,24,27" > apply(x,2,paste,collapse=",") [1] "1,2,3,10,11,12,19,20,21" "4,5,6,13,14,15,22,23,24" [3] "7,8,9,16,17,18,25,26,27" > apply(x,3,paste,collapse=",") [1] "1,2,3,4,5,6,7,8,9" "10,11,12,13,14,15,16,17,18" [3] "19,20,21,22,23,24,25,26,27" > apply(x,c(1,2),paste,collapse=",") [,1] [,2] [,3] [1,] "1,10,19" "4,13,22" "7,16,25" [2,] "2,11,20" "5,14,23" "8,17,26" [3,] "3,12,21" "6,15,24" "9,18,27" > > x , , 1 [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 , , 2 [,1] [,2] [,3] [1,] 10 13 16 [2,] 11 14 17 [3,] 12 15 18 , , 3 [,1] [,2] [,3] [1,] 19 22 25 [2,] 20 23 26 [3,] 21 24 27 lapply, sapplyリストに対するapply。applyじゃだめなのかと思うけど、applyは使えない。
dim(x)じゃなくて、names(x)を持つものに適用。
sapplyを使うと、リストじゃなくて、vector,arrayなどを返してくれる。
> x <-list("a"=c(1:4),"b"=c(7:11)) > apply(x,1,mean) 以下にエラー apply(x, 1, mean) : dim(X) は正の長さを持たねばなりません > lapply(x,mean) $a [1] 2.5 $b [1] 9 > sapply(x,mean) a b 2.5 9 mapplylapplyはリストのそれぞれのマージン?に対して関数を適用する形だった。
mapplyは、それぞれのリストの同一番号?を取ってきて(ベクトルとして)、それに関数を適用する。
引数の順番が他と違うのを注意。 名前付き引数でも指定できるが、、
> mapply(paste, c(1:5),letters[1:5],LETTERS[1:5], MoreArgs=list(sep="-")) [1] "1-a-A" "2-b-B" "3-c-C" "4-d-D" "5-e-E" > tapplyapply系の仲間に入れるかが適当か分からないけど、
あるデータフレームがある。その中のあるマージンについて計算したい。つきましては、別のマージンでの種類別に集計して欲しい。 というニーズ。
tapply(batting.2008.over100AB$AVG,batting.2008.over100AB$lgID,fivenum) $AL [1] 0.1688889 0.2430409 0.2682927 0.2868217 0.3575130 $NL [1] 0.1369863 0.2430417 0.2636656 0.2870744 0.3957219 分類項目は複数項目でも行ける。ウェブ解析のイメージでいくなら、セッション数をディメンジョンで切って表示する場合のイメージ。ディメンジョンを複数項目建てていく事は多い。
by関数 ほとんど同じ。名前付き引数の場合に、INDEX => INDICESとなる程度。返り値がby? リストのようなもの?
aggregate関数もほとんど同じだが、こちらはもっと複雑なことに対処できる。時系列分析など。
tapplyは、集計対象がヴェクター前提? aggregateはデータフレームでもいける。
aggreagateが汎用的そうな気がする。
tapplyは、SIMLIFY=TRUEになっていて、スカラー値の配列を返すので、処理はこっちのが簡単か。
でも、それにはrowsumという関数がある。rowsum(x, group,reorder=TRUE,...)
|
R関連 >