[R] apply, lapply, sapply, mpply, tapply
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)] <- '합'