- sapply 関数はlapply と同じ効果を示します。ただ、lapply はlist を返すことに対し、sapply関数は状況に応じてvector、matrix、list を返します。
- 引数の指定はlapply と同じく第1 引数の各要素に第2 引数の関数を処理し、for と
同じ効果を第1 引数のobject に示します。
- sapply 関数はsapply(object; 処理関数; 関数の第2 引数以降の指定· · · ) で定義しま
す。このとき、処理対象の第1 引数はvector かlist をとり、関数の第2 引数以降
はsapply の第3 引数以降に指定します。
- 具体的に示すと、
> (a <- list(1:10,seq(1,19,length.out=10))) #aは整数vectorからなるlist [[1]] [1] 1 2 3 4 5 6 7 8 9 10 [[2]] [1] 1 3 5 7 9 11 13 15 17 19 > sapply(a,mean) #リストの各オブジェクトに対してmean関数を当てはめる [1] 5.5 10.0
- これをmatrixにつかうと
> (a <- list(1:10,matrix(1:12,ncol=4))) #aは整数vectorとmatrixからなるlist [[1]] [1] 1 2 3 4 5 6 7 8 9 10 [[2]] [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12 > sapply(a,"*",3) # listの各オブジェクトに3を掛ける、四則演算をするときの第2引数は"ダブルクオート"で囲むこと [[1]] [1] 3 6 9 12 15 18 21 24 27 30 [[2]] [,1] [,2] [,3] [,4] [1,] 3 12 21 30 [2,] 6 15 24 33 [3,] 9 18 27 36
- data.frameの場合
> (a <- list(matrix(1:12,ncol=4), data.frame(matrix(1:12,ncol=3)))) [[1]] [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12 [[2]] X1 X2 X3 1 1 5 9 2 2 6 10 3 3 7 11 4 4 8 12 > sapply(a,rowSums) # matrix で返る [[1]] [1] 22 26 30 [[2]] [1] 15 18 21 24
と、vector、matrix、data.frameに関係なく同じ処理をしてくれます。
- lapplyとの違い
sapplyは処理後の次元が同じ場合、list形式でなく、matrixになります。
> (a <- list(matrix(1:6, ncol=3), matrix(5:10, ncol=3))) [[1]] [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 [[2]] [,1] [,2] [,3] [1,] 5 7 9 [2,] 6 8 10
-
- sapplyを適用した場合
> sapply(a, colSums) [,1] [,2] [1,] 3 11 [2,] 7 15 [3,] 11 19
-
- lapplyを適用した場合
> lapply(a, colSums) [[1]] [1] 3 7 11 [[2]] [1] 11 15 19
このように、c(3, 7, 11)とc(11,15,19)をcbindでまとめてくれます。
つまり、do.call("cbind", lapply(a, colSums))ですね。
- sapply関数のこの効果は、二つの文字ベクトルを総当たりでpasteで繋ぐときにちょっと便利
> (x <- LETTERS[1:5]) [1] "A" "B" "C" "D" "E" > (y <- letters[1:5]) [1] "a" "b" "c" "d" "e" > sapply(x, paste, y ,sep="-") A B C D E [1,] "A-a" "B-a" "C-a" "D-a" "E-a" [2,] "A-b" "B-b" "C-b" "D-b" "E-b" [3,] "A-c" "B-c" "C-c" "D-c" "E-c" [4,] "A-d" "B-d" "C-d" "D-d" "E-d" [5,] "A-e" "B-e" "C-e" "D-e" "E-e"
こんな感じ。
他にもsapplyは便利な時がありますが、おいおい紹介してゆきます。