프로그래밍 /R

[R] 반복문 없이 반복하기

yooj_lee 2019. 6. 27. 23:10
300x250

반복문 없이 반복하기

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의 각 원소에 대해 함수를 적용한다.

 

mapply 예시

 

 

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))

 

 

300x250