반복문 없이 반복하기
1. apply류
: apply, lapply, sapply, ...
1) apply
apply는 matrix에 대해서만 사용될 수 있다. 즉 모든 원소가 character, numeric, logical 중 어느 것이든지 같은 형이어야 한다. data.frame 같은 다른 객체에 사용하고 싶다면 먼저 객체를 matrix 형태로 변환해야함. data.frame 객체더라도 모든 원소가 같은 속성일 경우에는 상관없다.
apply(X, MARGIN, FUN)
when X: 다루고자 하는 객체
MARGIN: 함수를 어느 기준으로 적용할지 지정하는 것 (MARGIN이 1이면, row 방향. 2이면 column 방향.)
FUN: 적용하고자 하는 함수
2) lapply와 sapply
- lapply
: list의 각원소에 함수를 적용하고 list로 그 결과를 리턴. 입력값으로 벡터 역시 가능하다.
- sapply
: apply()함수보다 결과 값이 좀 더 간결하게 출력되는 함수. apply()함수의 MARGIN 파라미터 값을 2로 한 것과 동일하다. 결과를 vector로 리턴한다.
ex) sapply(df, class) → 한 눈에 변수별 class 보기 편함.
3) mapply
: 여러 list의 각 원소에 대해 함수를 적용한다.
2. aggregate
: 집계와 group by를 수행하는 함수.
* aggregate(formula, data, FUN)
- formula: a formula, such as y ~ x or cbind(y1, y2) ~ x1 + x2, where the y variables are numeric data to be split into groups according to the grouping x variables(usually factors).
- data: a data frame(or list) from which the variables in formula should be taken.
- FUN: a function to compute the summary statistics which can be applied to all data subsets.
ex) diamonds from ggplot2
→ Fair, Good, Very Good 등 cut의 각 타입에 대한 평균 price를 계산하고자 한다. 이때, aggregate는
aggregate(price ~ cut, diamonds, mean) 와 같이 호출될 수 있다.
여러 개의 변수로 데이터를 그룹화하려면, formula의 우측 부분에 추가 변수를 지정하면 되며 각 변수는 더하기(+)로 구분한다.
ex) aggregate(price ~ cut + color, diamonds, mean)
→ cut, color의 조합을 만들고 그 조합마다 price의 평균을 구한다.
두 변수를 집계하기 위해 formula의 좌측 부분에 cbind를 사용해 두 변수를 결합해야 한다. 즉, 집계(계산)될 데이터를 두 개 이상을 취하기 위해서는
aggregate(cbind(price, carat) ~ cut, diamonds, mean)
과 같이 커맨드를 작성한다.
** aggregate는 변수들에 대해 오직 하나의 함수만 지정할 수 있다.
3. plyr
1) ddply
: ddply는 data.frame을 입력으로 받아 변수에 따라 입력을 분리하고 분리된 각 부분에 대해 지정된 작업을 수행하고 data.frame 형태로 리턴한다.
ddply(X, .variables, .fun)
X: df 객체
.variabales: data.frame 객체를 split하는 기준이 되는 변수
.fun: 적용할 함수
ex)
2) llply
: lapply와 비슷한 기능을 수행
cf.) laply
: 결과를 vector로 리턴하는 함수
3) plyr 보조 함수 'each'
: each는 aggregate 같은 함수에 여러 함수를 사용할 수 있도록 해줌
ex) aggregate(price ~ cut, diamonds, each(mean, median))
'프로그래밍 > R ' 카테고리의 다른 글
[R] 스크립트 파일 관리 & 프로젝트 생성 및 관리 (0) | 2019.06.28 |
---|---|
[R] 데이터 재가공 (0) | 2019.06.27 |
[R] 데이터 읽어오기(read) & 데이터 기록하기(write) (0) | 2019.06.20 |
[R] 반복문(for loop, while loop) (0) | 2019.06.12 |
[R] 제어문(if, if~else if~, switch, ifelse) (0) | 2019.06.12 |