본문 바로가기

R

[R] ddply

ddply

: 데이터프레임을 분할하고 함수를 적용한 뒤 데이터프레임으로 결과를 반환하는 함수

install.packages('plyr')

library(plyr)

 

summarise

: 기준컬럼의 데이터끼리(그룹) 모은 후 함수에 적용. SQL문의 GROUP BY절과 동일함.

ddply(employees,'DEPARTMENT_ID',summarise,sum_sal=sum(SALARY))

→ DEPARTMENT_ID 별 SALARY의 합

x <- plyr::ddply(employees,'DEPARTMENT_ID',summarise,
                 SUM_SAL=sum(SALARY),
                 AVG_SAL=mean(SALARY),
                 MAX_SAL=max(SALARY))

&amp;amp;rarr; 여러 가지 함수를 한 번에 적용시킬 수 있다는 장점 존재

주의!

ddply(emp,'DEPARTMENT_ID',summarise,sum_sal=sum('SALARY'))

ddply(emp,DEPARTMENT_ID,summarise,sum_sal=sum(SALARY))

→ SALARY에 따옴표를 하거나 DEPARTMENT_ID에 따옴표를 하지 않으면 오류 발생

 

transform

: 행별로 연산을 수행해서 행당 값을 출력하는 기능.

SQL 분석함수와 유사하다. sum(qty) over(partition by year)

ddply(fruits,'year',transform,sum_qty=sum(qty))

ddply(fruits,'year',transform,sum_qty=sum(qty),pct_qry=qty/sum(qty)*100)

 

mutate

: transform기능과 유사하지만 mutate는 연산결과를 재사용할 수 있다.

ddply(fruits,'year',transform,sum_qty=sum(qty),pct_qry=qty/sum_qty*100) #오류 

ddply(fruits,'year',mutate,sum_qty=sum(qty),pct_qry=qty/sum_qty*100)

 

subset

: 그룹함수의 결과를 조건으로 수행하는 기능

ddply(fruits,'year',subset,qty==max(qty))


fruits <- read.csv("c:/data/fruits_sales.csv",header = T)

[문제124]fruits_sales.csv file 읽어 들인 후 과일 이름별 판매량, 판매합계를 구하세요.(tapply를 이용하세요)

더보기
x <- tapply(fruits$qty,fruits$name,sum)
y <- tapply(fruits$price,fruits$name,sum)
z <- cbind(x,y)

[문제125]과일 이름별 판매량, 판매합계를 구하세요.(aggregate를 이용하세요)

더보기
x <- aggregate(qty~name,fruits,sum)
y <- aggregate(price~name,fruits,sum)
merge(x,y)

[문제126]과일 이름별 판매량, 판매합계를 구하세요. (ddply함수를 이용하세요)

[문제127]년도별로 판매량 중에 가장 많은 판매를 한 년도를 출력해주세요.(tapply를 이용하세요)

더보기
t <- tapply(fruits$qty,fruits$year,max)
names(t[t==max(t)]) 
또는
rownames(t)[t==max(t)]

[문제128]년도별로 판매량 중에 가장 많은 판매를 한 년도를 출력해주세요.(aggregate를 이용하세요)

더보기
x <- aggregate(qty~year,fruits,sum)
x[x$qty==max(x$qty),'year']

[문제129]년도별로 판매량 중에 가장 많은 판매를 한 년도를 출력해주세요.(ddply를 이용하세요)

더보기
install.packages('plyr')
library(plyr)

plyr::ddply(fruits,'name',summarise,판매량=sum(qty),판매합계=sum(price))

[문제130] 년도별 과일 판매 비율을 출력해주세요.

더보기
①
ddply(fruits,'year',transform,sum_qty=sum(qty),pct_qry=qty/sum(qty)*100)
②
fruits[1,'qty'] / x[x$year == fruits[1,'year'],'qty'] * 100
fruits[2,'qty'] / x[x$year == fruits[2,'year'],'qty'] * 100
z<- NULL
for (i in 1:nrow(fruits)) {
z <- c(z,fruits[i,'qty'] / x[x$year == fruits[i,'year'],'qty'] * 100)
}
fruits$ratio <- z
③
x <- aggregate(qty~year,fruits,sum)
df <- merge(x,fruits,by='year')
df$pct_qty <- df$qty.y/df$qty.x * 100
df[,-2]

[문제131] 년도별로 가장많이 판매된 정보를 출력해주세요.

더보기
①
ddply(fruits,'year',subset,max(qty)==qty)
②
x <- ddply(fruits,'year',transform,max_qty=max(qty))
subset(x,x$max_qty==x$qty)
③
df <- ddply(fruits,'year',mutate,qty_max=max(qty),qty_bool=qty==qty_max)
df[df$qty_bool==TRUE,]

[문제132]부서별로 최고 급여자들의 정보를 출력해주세요.

더보기
①
library(dplyr) 
plyr::ddply(employees,'DEPARTMENT_ID',subset,SALARY==max(SALARY))
②
dept_max <- aggregate(SALARY~DEPARTMENT_ID,employees,max) #NA값 미포함 
merge(dept_max,employees,by=c('DEPARTMENT_ID','SALARY'))

[문제133]부서별로 가장 처음으로 입사한 사원 정보를 출력해주세요.

더보기
①
employees$HIRE_DATE <- as.Date(employees$HIRE_DATE,format='%Y-%m-%d') 
plyr::ddply(employees,'DEPARTMENT_ID',subset,HIRE_DATE==min(HIRE_DATE))
②
dept_min <- aggregate(HIRE_DATE~DEPARTMENT_ID,employees,min) 
merge(dept_min,employees,by=c('DEPARTMENT_ID','HIRE_DATE'))

[문제134]자신의 부서 평균 급여 보다 더 많이 받는 사원들의 EMPLOYEE_ID,DEPARTMENT_ID,SALARY를 출력해주세요.

더보기
①
plyr::ddply(employees,'DEPARTMENT_ID',subset,SALARY>mean(SALARY))
            [c('EMPLOYEE_ID','DEPARTMENT_ID','SALARY')]
②
df <- plyr::ddply(employees,'DEPARTMENT_ID',transform,AVG_SAL=mean(SALARY)) 
df[df$SALARY > df$AVG_SAL,c('EMPLOYEE_ID','DEPARTMENT_ID','SALARY','AVG_SAL')]
③
dept_avg <- aggregate(SALARY~DEPARTMENT_ID,employees,mean) 
names(dept_avg)[2] <- 'AVG_SAL' 
df <- merge(employees,dept_avg) 
df[df$SALARY > df$AVG_SAL,c('EMPLOYEE_ID','DEPARTMENT_ID','SALARY','AVG_SAL')]

'R' 카테고리의 다른 글

[R] dplyr::summarise()  (0) 2022.01.19
[R] dplyr  (0) 2022.01.19
[R] subset  (0) 2022.01.18
[R] merge  (0) 2022.01.17
[R] 함수, 중첩함수  (0) 2022.01.17
Recent Posts
Popular Posts
Recent Comments