보통 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를 사용하면, 벡터형 인자도 처리가 가능하기 때문.
'Research & Analysis > R' 카테고리의 다른 글
[R/ split 함수] 나눠봅시다. split! (0) | 2018.05.07 |
---|---|
[R] 큰 데이터를 읽을 때 습관 들이기: 클래스를 미리 알자 (read.table) (0) | 2018.01.25 |
[R] read.dta 가 안 먹힐 때 (stata 파일 불러오기) (1) | 2018.01.08 |