R ์ธ์ด์์ apply ํจ์๋ ๋ฐ๋ณต๋ฌธ์ ๋์ฒดํ๋ค. Javascript์์์ foreach ํจ์์ ๋น์ทํ ๊ธฐ๋ฅ์ ํ๋ค๊ณ ๋ณผ ์๋ ์๊ฒ ๋ค. apply function "family" ๋ผ๊ณ ํ ์ด์ ๋ apply() ํจ์์์ ํ์๋ lapply, sapply, mapply ๋ฑ์ ํจ์๋ค์ด ์ฌ๋ฌ ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ํผ vector, matrix ๋ฑ์ data๋ฅผ ์ฃผ๋ก ๋ค๋ฃจ๋ R ํ๋ก๊ทธ๋๋ฐ์์ apply ํจ์๋ ํ์์ ์ด๋ค.
์ฌ์ค apply function family ์ค์์ ๊ฐ์ฅ ์์ฃผ ์ฐ์ด๋ ๊ฑด apply ํจ์์ด๋ฏ๋ก ๋ค๋ฅธ ํจ์๋ค์ ๋๊ฐ ์ด๋จ ๋ ์ฐ๋์ง๋ง ๋ค๋ฃจ๊ณ ๋์ด๊ฐ๋ ค๊ณ ํ๋ค.
apply(Object, Margin, Function)
: matrix objects, returns a vector
lapply(Object, Function)
: vector, matrix, list, data frame objects, returns a list
sapply(Object, Function)
: vector, matrix, list, data frame objects, returns a vector
์์ ์ธ ๊ฐ ํจ์๊ฐ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ apply ํจ์๋ก ์ฐ์ธ๋ค.
Function
์ Object
์ ๊ฐ element์ ์ ์ฉ์ํจ๋ค. Margin
parameter๊ฐ ๋ฐ๋ณต์ ๋ฐฉํฅ์ ์ ํ๋ค. Margin
์ด 1์ด๋ฉด ๋ชจ๋ ํ(row)์ ๋ํด ๋ฐ๋ณตํ๊ณ , Margin
์ด 2์ด๋ฉด ๋ชจ๋ ์ด(column)์ ๋ํด ๋ฐ๋ณตํ๋ค. (R ์ธ์ด๋ row๋ฅผ 1, column์ 2๋ก ๊ฐ์ฃผํ๊ณ ์ฒ๋ฆฌํ๋ ์์ง ๋ง ๊ฒ) object
์ ๊ฐ ์์๋ฅผ ์ํํ๋ฉฐ ํจ์๋ฅผ ์ ์ฉํ๋ค. lapply ํจ์์ sapply ํจ์์ ์ฐจ์ด์ ์ ๋ฆฌํด๊ฐ์ด๋ค. lapply ํจ์๋ list๋ฅผ ๋ฆฌํดํ๊ณ , sapply ํจ์๋ simplied form = vector๋ก ๋ฆฌํดํ๋ค.lapply
, sapply
ํจ์๊ฐ ๋์ง ์์๋ ์ถ๋ค.vapply()
: sapply() ํจ์์ ๋น์ทํ๋ฐ, output format = return format ์ ๋ช
ํํ๊ฒ ์ง์ ํ ์ ์์ด ์์ ํ๊ฒ ์ฐ์ฐํ ์ ์๋ค.tapply()
: ๊ทธ๋ฃน๋ณ ์ฒ๋ฆฌ๋ฅผ ์ํ ํจ์์ด๋ค. ๊ทธ๋ฃน์ parameter๋ก ๋๊ธฐ๊ณ (factor type) element๋ณ ์ฒ๋ฆฌ๊ฐ ์๋, ๊ทธ๋ฃน๋ณ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.mapply()
: sapply() ํจ์์ ๋น์ทํ์ง๋ง multiple parameters ๊ฐ ๋๊ฒจ์ง๋ค. ๊ธฐ์กด apply ํจ์๋ค์์๋ data๋ฅผ ๋จผ์ ์ธ์๋ก ๋๊ฒผ์ง๋ง, mapply์์๋ ํจ์๋ฅผ ๋จผ์ ์ธ์๋ก ๋๊ธด๋ค.> library(readxl)
> t1 <- read_excel(path = "titanic3.xls", sheet = "titanic3")
## ๊ฒฝ๊ณ ๋ฉ์์ง(๋ค):
## In read_fun(path = enc2native(normalizePath(path)), sheet_i = sheet, :
## Coercing text to numeric in M1306 / R1306C13: '328'
> str(t1)
## tibble [1,309 x 14] (S3: tbl_df/tbl/data.frame)
## $ pclass : num [1:1309] 1 1 1 1 1 1 1 1 1 1 ...
## $ survived : num [1:1309] 1 1 0 0 0 1 1 0 1 0 ...
## $ name : chr [1:1309] "Allen, Miss. Elisabeth Walton" "Allison, Master. Hudson Trevor" "Allison, Miss. Helen Loraine" "Allison, Mr. Hudson Joshua Creighton" ...
## $ sex : chr [1:1309] "female" "male" "female" "male" ...
## $ age : num [1:1309] 29 0.917 2 30 25 ...
## $ sibsp : num [1:1309] 0 1 1 1 1 0 1 0 2 0 ...
## $ parch : num [1:1309] 0 2 2 2 2 0 0 0 0 0 ...
## $ ticket : chr [1:1309] "24160" "113781" "113781" "113781" ...
## $ fare : num [1:1309] 211 152 152 152 152 ...
## $ cabin : chr [1:1309] "B5" "C22 C26" "C22 C26" "C22 C26" ...
## $ embarked : chr [1:1309] "S" "S" "S" "S" ...
## $ boat : chr [1:1309] "2" "11" NA NA ...
## $ body : num [1:1309] NA NA NA 135 NA NA NA NA NA 22 ...
## $ home.dest: chr [1:1309] "St Louis, MO" "Montreal, PQ / Chesterville, ON" "Montreal, PQ / Chesterville, ON" "Montreal, PQ / Chesterville, ON" ...
> apply(t1, 2, typeof)
## pclass survived name sex age sibsp
## "character" "character" "character" "character" "character" "character"
## parch ticket fare cabin embarked boat
## "character" "character" "character" "character" "character" "character"
## body home.dest
## "character" "character"
> lapply(t1, typeof)
> sapply(t1, typeof)
# lapply(t1, typeof)
## $pclass
## [1] "double"
##
## $survived
## [1] "double"
##
## $name
## [1] "character"
##
## $sex
## [1] "character"
##
## $age
## [1] "double"
##
## $sibsp
## [1] "double"
##
## $parch
## [1] "double"
##
## $ticket
## [1] "character"
##
## $fare
## [1] "double"
##
## $cabin
## [1] "character"
##
## $embarked
## [1] "character"
##
## $boat
## [1] "character"
##
## $body
## [1] "double"
##
## $home.dest
## [1] "character"
# sapply(t1, typeof)
## pclass survived name sex age sibsp
## "double" "double" "character" "character" "double" "double"
## parch ticket fare cabin embarked boat
## "double" "character" "double" "character" "character" "character"
## body home.dest
## "double" "character"
> m1 <- matrix(1:20, nrow=4, ncol=5)
> myapplyCol <- function(Obj, Margin, Func, ...) {
result <- vector()
for(i in 1:ncol(Obj))
result <- c(result, Func(Obj[,i], ...))
return(result)
}
> myapplyRow <- function(Obj, Margin, Func, ...) {
result <- vector()
for(i in 1:nrow(Obj))
result <- c(result, Func(Obj[i,], ...))
return(result)
}
> m1
> myapplyCol(m1, 2, sum)
> myapplyRow(m1, 1, sum)
# return m1 (check for matrix that we made)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
## [1] 10 26 42 58 74 # myapplyCol : apply sum() for every column
## [1] 45 50 55 60 # myappleRow : apply sum() for every row
๋ฐ์ดํฐ ์ฌ์ด์ธ์ค ๊ณผ๋ชฉ ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค ๐