본문 바로가기

Research & Analysis/R

[R / Loop Functions] For를 쓰지 않고 반복작업을 해보자.

보통 for, while, repeat 등등을 통해 반복문을 작성하지만, R에서는 다른 스타일을 좀 더 선호한다. 

코드가 간결해지고 짧아지는 장점!이 크다 (속도 차이는 거의 없다고 하지만..)


apply 계열의 loop function이 그 역할을 하는데 크게 다섯 가지가 있다.


1. lapply (X, FUN, ...)

list X 의 모든 element 에 대해 FUN을 적용할 때 사용한다.

... 에는 FUN에 넘겨줄 인자들을 넣는다.

결과값도 list 형태다.


ex)

x <- list (a = 1:5, b = rnorm(10))

lapply (x, mean)


또한 anonymous function (이름이 없이 명령행 안에서 정의되는 함수) 을 쓸 때에도 lapply를 유용하게 사용한다.


ex) lapply(x, function(elt) elt[, 1])



2. sapply (X, FUN, ...)

lapply의 simple ver 다. 

lapply와 다르게, sapply의 결과값은 vector 다.

만약 sapply의 결과값이 모두 같다면, matrix 형태의 결과를 볼 수 있다.


ex) sapply(iris[,1:4], mean) // iris의 1:4번째 열에 대해 mean 함수 적용


3. apply (X, Margin, FUN, ...)

array 에서 dim 별(row/column) 함수 적용할 때 사용한다.


ex) apply(iris[,1:4], 2, mean) // iris의 1:4번째 열에 대해 열마다(2)mean 함수 적용

apply(iris[,1:4], 1, mean) // iris의 1:4번째 열에 대해 행마다(1) mean 함수 적용


colSums, rowSums, colMeans, rowMeans 와 비슷한 역할이지만, 다양한 함수를 적용할 수 있다는 장점이 있다.

하지만 이렇게 따로 함수가 존재하는 경우 별도 함수를 쓰는 것이 apply 를 쓰는 것보다 훨.씬. 빠르다고 한다.


4. tapply (X, INDEX, FUN)

X(subsets of vector) 에 FUN 적용한다. INDEX를 참고하여 group에 대해 


ex) tapply(iris[, 1], iris[,5], mean)  // iris[,5] 를 기준으로 iris[,1] 의 평균 구하기


5. mapply (FUN, ..., MoreArgs = NULL)

lapply를 많이 적용할 때) 로 나뉜다. 함수, 적용할 대상, 함수에 대한 인자 로 위에 apply 들과 인자 순서가 조금 다름을 유의하자.


함수를 vector화 하는 것도 mapply를 사용하면 가능하다.

함수가 단일 인자를 받을 때, mapply를 사용하면, 벡터형 인자도 처리가 가능하기 때문.