R

[R] apply, lapply, sapply, mpply, tapply

ㄷㅐ장님 2022. 1. 14. 02:32

apply(변수,행/열,그룹함수)

: 함수를 반복 수행 -행렬,배열,데이터 프레임에 함수를 적용한 결과를

벡터,리스트,배열 형태로 리턴하는 함수

 

m < -matrix(1:4,ncol=2)

apply(m,MARGIN = 1, sum) : 4 6

apply(m, 1, sum) : 4 6

apply(m,MARGIN = 2, sum) : 3 7

apply(m, 2, sum) : 3 7

1 : 행의 합 / 2 : 열의 합

 

df <- data.frame(name=c('king','smith','scott'),

       sql=c(90,NA,70),

     r=c(80,70,NA))

학생별 sql과 python 점수 합(행의 합) :

apply(df[,c(2,3)],1,sum)

NA를 제외한 점수의 합 :

apply(df[,c(2,3)],1,sum,na.rm=T)

(+) rowSums 사용도 가능 :

rowSums(df[,c(2,3)],na.rm=T)

(+) rowMeans도 제공됨

 

과목별 점수의 합 :

apply(df[,c(2,3)],2,sum,na.rm=T)

(+) colSums 사용 가능 :

colSums(df[,c(2,3)],na.rm=T)

(+) colMeans도 제공됨

 

lapply(변수,그룹함수)

: 벡터,리스트,데이터프레임에 함수를 적용하고

그 결과를 리스트형식으로 반환하는 함수

 

x <- list(a=1:3,b=4:10,c=11:21)

sum(x$a) : 6

sum(x$b) : 15

⇒ lapply(x,sum)

 

df <- data.frame(name=c('king','smith','scott'),

       sql=c(90,NA,70),

     r=c(80,70,NA))

lapply(df[,c(2,3)],sum,na.rm=T) : 열의 합

list apply(df[,c(2,3)],MARGIN=2,sum,na.rm=T) :열의 합

colSums(df[,c(2,3)],na.rm=T) : 열의 합

 

sapply(변수,그룹함수)

: 벡터, 리스트, 데이터프레임에 함수를 적용하고

그 결과를 벡터로 반환하는 함수

 

sapply(df[,c(2,3)],sum,na.rm=T)

⇒ apply margin 2와 같음

 

mapply

rep(1,5)

rep(2,4)

rep(3,3)

rep(4,2)

rep(5,1)

⇒ mapply(rep,1:5,5:1)

 

tapply

: 벡터, 데이터프레임에 저장된 데이터를 주어진 기준에 따라 그룹을 묶은 뒤

그룹함수를 적용하고 그 결과를 array형식(가로방향)으로 리턴하는 함수

 

aggregate(SALARY~DEPARTMENT_ID,employees,sum) : 세로형식 tapply(employees$SALARY,employees$DEPARTMENT_ID,sum) : 가로형식

 

tapply(emp$SALARY,list(emp$DEPARTMENT_ID,emp$JOB_ID),sum,default=0)

⇒ 행에는 DEPARTMENT_ID, 열에는 JOB_ID

DEPARTMENT_ID와 JOB_ID별 SALARY의 합

default=0 : NA대신 0

 

(+) list 형태로 넣지 않고, data.frame으로 넣는 것도 가능

tapply(emp$SALARY,data.frame(emp$DEPARTMENT_ID,emp$JOB_ID),sum,default=0)


[문제72] 년도별 총액급여를 구하세요.(가로방향으로 출력)

더보기
tapply(emp$SALARY,lubridate::year(employees$HIRE_DATE),sum,default=0)

[문제73] 요일별 총액급여를 구하세요.(가로방향으로 출력)

더보기
tapply(employees$SALARY,lubridate::wday(employees$HIRE_DATE,week_start = 1,label = T),sum)

[문제74] 부서별,년도별 총액급여를 출력해주세요.

더보기
tapply(emp$SALARY,list(emp$DEPARTMENT_ID,lubridate::year(employees$HIRE_DATE)),sum,default=0)

[문제75] 년도별, 분기별 총액급여, 행의 합, 열의 합을 출력해주세요.

더보기
x<-tapply(employees$SALARY,
         list(lubridate::year(employees$HIRE_DATE),
              lubridate::quarter(employees$HIRE_DATE)),
              sum,default=0)
              
x <- data.frame(x)
names(x) <- c('1분기','2분기','3분기','4분기')
x$합 <- apply(x,1,sum)
x <- rbind(x,apply(x,2,sum))
rownames(x)[nrow(x)] <- '합'