R

[R] subset

ㄷㅐ장님 2022. 1. 18. 15:43

subset

: 조건에 만족하는 데이터를 선택하는 함수

 

employees[employees$DEPARTMENT_ID==20,] : 모든 열의 값이 NA인 행 존재

 

employees[which(employees$DEPARTMENT_ID==20),] : 모든 열의 값이 NA인 행은 출력되지 않음

subset(employees,employees$DEPARTMENT_ID==20) : 모든 열의 값이 NA인 행은 출력되지 않음

 

subset(employees,DEPARTMENT_ID==20,select=c('LAST_NAME','SALARY'))

: select를 통해 출력하고 싶은 열 설정 가능

subset(employees,DEPARTMENT_ID==20,select=c(LAST_NAME,SALARY)) : ’ ’없어도 됨


[문제120] 30번 부서 사원이면서 급여는 3000이상 받는 사원들의 LAST_NAME, HIRE_DATE,SALARY,DEPARTMENT_ID를 출력해주세요.

더보기
subset(employees,DEPARTMENT_ID==30 & SALARY >=3000,
       select=c('LAST_NAME', 'HIRE_DATE','SALARY','DEPARTMENT_ID'))

[문제121] 입사한 날짜가 2002, 2003년도에 입사한 사원들의 last_name, hire_date, salary, job_id, department_id 출력해주세요.

더보기
employees$HIRE_DATE <- as.Date(employees$HIRE_DATE,format='%Y-%m-%d')
subset(employees,format(HIRE_DATE,'%Y') %in% c('2002','2003'),
       select=c('LAST_NAME','HIRE_DATE','SALARY','JOB_ID','DEPARTMENT_ID'))

[문제122] 150번 사원의 급여보다 더 많은 급여를 받는 사원들의 last_name, salary를 출력하세요.

더보기
①
subset(employees,SALARY >= employees[employees$EMPLOYEE_ID==150,'SALARY'],select=c(LAST_NAME,SALARY))
②
sal150 <- subset(employees,EMPLOYEE_ID==150,select=SALARY)
subset(employees,SALARY >= sal150,select=c(LAST_NAME,SALARY))
subset(employees,SALARY >= sal150) #결과값 오류 : 데이터프레임값으로 비교X
subset(employees,SALARY >= as.integer(sal150)) #subset에서 비교값은 단일값으로 설정해서 비교

[문제123]부서이름별 총액,평균,최대를 출력해주세요. 소속부서가 없는 정보도 출력해주세요. DEPARTMENT_NAME   SUM_SAL   AVG_SAL MAX_SAL

소속부서X                   7000  7000.000    7000

Administration             4400  4400.000    4400

Marketing                  19000  9500.000   13000

.......

더보기
x1 <- aggregate(SALARY~ifelse(is.na(DEPARTMENT_ID),0,DEPARTMENT_ID),employees,sum)
x2 <- aggregate(SALARY~ifelse(is.na(DEPARTMENT_ID),0,DEPARTMENT_ID),employees,mean)
x3 <- aggregate(SALARY~ifelse(is.na(DEPARTMENT_ID),0,DEPARTMENT_ID),employees,max)

names(x1) <- c('DEPARTMENT_ID','SUM_SAL')
names(x2) <- c('DEPARTMENT_ID','AVG_SAL')
names(x3) <- c('DEPARTMENT_ID','MAX_SAL')

m <- merge(merge(x1,x2),x3)

result <- merge(m,departments,all.x=T)[,c('DEPARTMENT_NAME','SUM_SAL','AVG_SAL','MAX_SAL')]
result[is.na(result$DEPARTMENT_NAME),'DEPARTMENT_NAME'] <- '소속부서x'