본문 바로가기

R

[R] rank

rank

오름차순 순위

x <- c(85,80,90,70,60,80,NA)

rank(x)

rank(x,na.last=T,ties.method = 'average') : rank함수 기본값

na.last=T : NA값을 마지막에 na.last=F : NA값을 첫번째에

data.frame(점수=x,순위=rank(x,na.last=T,ties.method = 'first'))

: 동차일 경우 앞순서가 먼저순위

data.frame(점수=x,순위=rank(x,na.last=T,ties.method = 'last'))

: 동차일 경우 뒷순서가 먼저순위

data.frame(점수=x,순위=rank(x,na.last=T,ties.method = 'random'))

: 동차일 경우 랜덤으로 순위

data.frame(점수=x,순위=rank(x,na.last=T,ties.method = 'max'))

: 동차일 경우 더 높은순위(4)로 동순위

data.frame(점수=x,순위=rank(x,na.last=T,ties.method = 'min'))

: 동차일 경우 더 낮은순위(3)로 동순위

data.frame(점수=na.omit(x),순위=rank(x,na.last=NA,ties.method = 'min'))

: NA값 제거

data.frame(점수=x,순위=rank(x,na.last='keep',ties.method = 'min'))

: NA값 = NA

data.frame(점수=x, 
           순위_1=dplyr::min_rank(x), #NA값 = NA
           순위_2=dplyr::dense_rank(x)) #연이은 순위 오름차순

 

내림차순 순위

rank(-x,na.last=T,ties.method = 'min')

data.frame(점수=x, 
           순위_1=rank(-x,na.last=T,ties.method = 'min'),
           순위_2=dplyr::min_rank(desc(x)), 
           순위_3=dplyr::dense_rank(desc(x))) #연이은 순위 내림차순


[문제142] 급여를 많이 받는 순으로 순위를 구한다음에 1등에서 5위 까지 출력해주세요. 연이은 순위를 이용하세요.

더보기
library(dplyr)
employees%>%
dplyr::mutate(rank=dplyr::dense_rank(desc(SALARY)))%>%
dplyr::filter(rank<=5)

employees$rank <- dplyr::dense_rank(desc(employees$SALARY))
employees[employees$rank<=5,]

[문제143] ann_sal 새로운 컬럼을 생성하세요. 값은 commission_pct NA 면 salary * 12, 아니면 (salary * 12) + (salary * 12 * commission_pct) 입력한 후 ann_sal컬럼의 값에 내림차순 기준으로 10위까지 출력해주세요.

1) 연이은 순위일 때

2) 동차를 높은순위로 할 때

더보기

1) 연이은 순위일 때

employees%>%
  dplyr::mutate(ann_sal=ifelse(is.na(COMMISSION_PCT),SALARY*12,
                              (SALARY * 12) + (SALARY * 12 * COMMISSION_PCT)),
  rank=dense_rank(desc(ann_sal)))%>%
  dplyr::filter(rank<=10)
employees$dense_rank <- dplyr::dense_rank(employees$ann_sal) #연이은 순위인지 확인必
employees[employees$dense_rank<=10,]

2) 동차를 높은순위로 할 때

employees%>%
  dplyr::mutate(ann_sal=ifelse(is.na(COMMISSION_PCT),
                         SALARY*12,(SALARY * 12) + (SALARY * 12 * COMMISSION_PCT)),
  rank=min_rank(desc(ann_sal)))%>%
  dplyr::filter(rank<=10)

employees$ann_sal <- ifelse(is.na(employees$COMMISSION_PCT),employees$SALARY*12,
(employees$SALARY * 12) + (employees$SALARY * 12 * employees$COMMISSION_PCT))
employees$min_rank <- dplyr::min_rank(employees$ann_sal)
employees[employees$min_rank<=10,]

[문제144] 부서별 급여를 기준으로 내림차순 순위를 구하세요.

더보기
library(dplyr)
library(plyr)
df <- plyr::ddply(employees[,c('EMPLOYEE_ID','LAST_NAME','SALARY','DEPARTMENT_ID')],
                            'DEPARTMENT_ID',transform,순위=dplyr::dense_rank(desc(SALARY)))
library(doBy)
doBy::orderBy(~DEPARTMENT_ID+순위,df)

employees%>%
	dplyr::select(EMPLOYEE_ID,LAST_NAME,SALARY,DEPARTMENT_ID)%>%
	dplyr::group_by(DEPARTMENT_ID)%>%
	dplyr::mutate(순위=dplyr::dense_rank(desc(SALARY)))%>%
	dplyr::arrange(DEPARTMENT_ID,순위)

+)SQL

select employee_id,last_name,salary,department_id,
       rank() over(partition by department_id order by salary desc) 순위2,
       dense_rank() over(partition by department_id order by salary desc) 순위1
from employees
order by 4,6;

[문제145] JOB_ID별 급여를 많이 받는 사원 1등만 추출해 주세요.

더보기
plyr::ddply(employees[,c('EMPLOYEE_ID','LAST_NAME','SALARY','JOB_ID')],'JOB_ID',subset,
                                                                       SALARY==max(SALARY))

plyr::ddply(employees[,c('EMPLOYEE_ID','LAST_NAME','SALARY','JOB_ID')],'JOB_ID',subset,
                                                         dplyr::dense_rank(desc(SALARY))==1)

employees%>%
	dplyr::select(EMPLOYEE_ID,LAST_NAME,SALARY,JOB_ID)%>%
	dplyr::group_by(JOB_ID)%>%
	dplyr::mutate(순위=dplyr::dense_rank(desc(SALARY)))%>%
	dplyr::filter(순위==1)

employees%>%
	dplyr::select(EMPLOYEE_ID,LAST_NAME,SALARY,JOB_ID)%>%
	dplyr::group_by(JOB_ID)%>%
	dplyr::filter(dplyr::dense_rank(desc(SALARY))==1)

'R' 카테고리의 다른 글

[R] sqldf  (0) 2022.01.20
[R] join  (0) 2022.01.20
[R] dplyr::summarise()  (0) 2022.01.19
[R] dplyr  (0) 2022.01.19
[R] ddply  (0) 2022.01.18
Recent Posts
Popular Posts
Recent Comments