ch0nny_log

[빅데이터분석] R _ 21. 일반함수(ifelse) 본문

빅데이터 분석(with 아이티윌)/R

[빅데이터분석] R _ 21. 일반함수(ifelse)

chonny 2024. 6. 27. 18:04

 

ifelse (조건, 바꿀값, 기본값)
- 조건이 true = 바꿀값 출력
- 조건이 FALSE = 기본값 출력

SQL VS R
nvl ifelse
decode ifelse
case ifelse

NVL

문제1. 이름과 커미션을 출력하는데 커미션이 null 인 사원들은 0으로 출력하시오.
1) SQL
select enams, nvl(comm,0)
	from emp;​
2) R
## 파생컬럼 emp$comm_zero 추가 하여 null을 0으로 치환​
emp$comm_zero <- ifelse(is.na(emp$comm),0,emp$comm)
  emp

설명: ifelse(조건, 바꿀값, 기본값)

문제2. titanic2.csv 를 가지고 tat 라는 데이터 프레임을 만드시오 !
tat<- read.csv('tatanic2.csv',header = T)
colSums(is.na(tat))​
문제3. AGE2 라는 컬럼을 생성하는데 TAT의 AGE컬럼으로 데이터를 만들고 결측치는 31로 채워서 넣으시오.
 tat$age2 <- ifelse(is.na(tat$age), 31, tat$age )
 tat​

※ 현업 팁 ! 삼성전자의 전자 제품 다음달 예상 판매량 예측하는 모델을 만드는 이한웅(8기) 데이터 분석가의 코드에 ifelse 를 이용해서 파생변수를 생성하는 코드로 가득차 있습니다.  데이터 분석가들 끼리 회의를 할 때 결측치에
어떤 값을 채워넣을지를 항상 연구하고 어떤 파생변수를 생각해낼지를 연구하는데 신입 데이터 분석가의 조언도 굉장히 유심히 듣는다고 합니다.

decode

문제1. 이름, 부서번호, 보너스를 출력하는데 부서번호가 10번이면 5000을 출력하고 그렇지 않고 20번이면 4000을 출력하시고 나머지 부서는 0으로 출력하시오
1) SQL
select ename, deptno, decode(deptno,10,5000,
									20,4000,
                                     	0) 보너스
     from emp;​
2) R
emp$bonus <- ifelse( emp$deptno==10, 5000, ifelse( emp$deptno==20, 4000,0) )
emp[            , c("ename", "deptno", "bonus") ]​

 

CASE

문제1. 이름, 월급, 등급을 출력하는데 월급이 3000이상이면 A, 2000이상 3000이하이면 B을 출력, 나머지는 C를 출력하시오.
1) SQL
select ename,sal,case when sal >= 3000 then 'A'
						   sal >= 3000 then 'B'
                           else 'C' end 등급
        from emp;​
2) R
emp$grade <- ifelse(emp$sal >= 3000,'A',ifelse(emp$sal >=2000,'B','C'))
emp[            , c("ename", "grade") ]​

문제 2. tat 데이터 프레임에 women_child 파생변수를 추가하는데 성별이 여자이거나  나이가 12이하면 1로 만들고
아니면 0으로 값을 만드시오.

tat$women_child <- ifelse( (tat$sex=='female') | (tat$age2 <=12 ), 1, 0)
tat$women_child
table(tat$women_child)

문제 3. sql 포트폴리오에서 마들었던 테이블을 r데이터 프레임으로 생성하고 지금까지 배운 내용으로 조회할 수 있는 간단한 검색문제를 스스로 내서 r로 작성하고 출력하시오. 
setwd("c:\\data")
birth_table2 <- read.csv("birth_table2.csv",header=T ,fileEncoding="euc-kr")
birth_table2​


birth_rank <- birth_table2[order(birth_table2$b_cnt, decreasing = TRUE), c('b_district', 'b_cnt')]
head(birth_rank, 10)