R関連‎ > ‎

データ準備(apply系)

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
パッと見はイメージがつかめない。3次元は??? x[i][j][1], x[i][j][2]と考えると描いてあるけど、考えないと出てこないな。

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


mapply

lapplyはリストのそれぞれのマージン?に対して関数を適用する形だった。
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"
SIMPLIFY=TRUEとすると、リストで返る。


tapply

apply系の仲間に入れるかが適当か分からないけど、
あるデータフレームがある。その中のあるマージンについて計算したい。つきましては、別のマージンでの種類別に集計して欲しい。 というニーズ。
 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

2008年のAL,NLの打率分布。
分類項目は複数項目でも行ける。ウェブ解析のイメージでいくなら、セッション数をディメンジョンで切って表示する場合のイメージ。ディメンジョンを複数項目建てていく事は多い。
by関数 ほとんど同じ。名前付き引数の場合に、INDEX => INDICESとなる程度。返り値がby? リストのようなもの?
aggregate関数もほとんど同じだが、こちらはもっと複雑なことに対処できる。時系列分析など。
tapplyは、集計対象がヴェクター前提? aggregateはデータフレームでもいける。
aggreagateが汎用的そうな気がする。
tapplyは、SIMLIFY=TRUEになっていて、スカラー値の配列を返すので、処理はこっちのが簡単か。
でも、それにはrowsumという関数がある。rowsum(x, group,reorder=TRUE,...)


Joseph Adler¥ 4,423 (2% OFF)
Databases:37位 (2010.09.04)
Comments