본문 바로가기

Study/class note

R / 조인

16 R 에서의 조인

SQL R Python
equi join merge pd.merge
non equi join
outer join
self join

 

문제84. dept3.csv를 R로 로드해서 dept데이터 프레임을 생성하시오.

dept <- read.csv("c:\\data\\dept3.csv")
dept

문제85. 이름과 부서위치를 출력하시오.

-- SQL
select e.ename, d.loc
 from emp e, dept d
 where e.deptno = d.deptno;
# R
x<- merge(emp, dept, by = 'deptno')
x[ , c("ename", "loc")]
# python
dept = pd.read_csv("c:\\data\\dept3.csv")
emp = pd.read_csv("c:\\data\\emp3.csv")

x = pd.merge(emp, dept, on = 'deptno')
x[['ename', 'loc']]
	# 또는
x.loc[:, ['ename', 'loc']]   #데이터프레임.loc[ 검색할 행 조건, 검색할 컬럼명]
# x.loc[x['loc'] == 'DALLAS', ['ename', 'loc']] 이와같이 검색 가능

문제86. 직업이 SALESMAN이고 월급이 1000 이상인 사원들의 이름, 월급, 부서위치를 출력하시오.

-- SQL
select e.ename, e.sal, d.loc
 from emp e, dept d
 where e.deptno = d.deptno and e.job = 'SALESMAN' and e.sal >= 1000;
# R
x<- merge(emp, dept, by = 'deptno')
x[ (x$job == 'SALESMAN') &(x$sal >= 1000) , c("ename", "sal","loc")]
# python
x = pd.merge(emp, dept, on = 'deptno')
x[['ename', 'sal','loc']][(x['job'] == 'SALESMAN')&(x['sal']>=1000)]
	# 또는
x.loc[(x.sal>=1000) & (x.job == 'SALESMAN'), ['ename', 'sal', 'loc']]

문제87. 커미션이 null인 사원들의 이름, 부서위치, 커미션을 출력하시오.

-- SQL
select e.ename, d.loc, e.comm
 from emp e, dept d
 where e.deptno = d.deptno and e.comm is null;
# R
x<- merge(emp, dept, by = 'deptno')
x[ is.na(x$comm) , c("ename", "loc", "comm")]
# python
x = pd.merge(emp, dept, on = 'deptno')
x.loc[x.comm.isna(), ['ename', 'loc', 'comm']]

문제88. 월급이 1000에서 3000 사이인 사원들의 이름, 월급, 부서위치를 출력하시오.

-- SQL
select e.ename, e.sal, d.loc
 from emp e, dept d
 where e.deptno = d.deptno and e.sal between 1000 and 3000;
# R
x<- merge(emp, dept, by = 'deptno')
x[(x$sal<=3000) & (x$sal>= 1000), c("ename", "sal", "loc")]
# python
x = pd.merge(emp, dept, on = 'deptno')
x.loc[(x.sal<=3000) & (x.sal>= 1000), ['ename', 'sal', 'loc']]
	# 또는
x.loc[ x.sal.between(1000,3000), ['ename', 'sal', 'loc']]

 

문제89. (오늘의 마지막 문제) 부서위치, 부서위치별 토탈월급을 원형그래프로 시각화하시오.

-- SQL
select d.loc, sum(e.sal), round(ratio_to_report(sum(e.sal)) over () * 100,2) as pct
 from emp e, dept d
 where e.deptno = d.deptno
 group by d.loc;
# R
x<- merge(emp, dept, by = 'deptno')
result <- tapply(x$sal, x$loc, sum)
result2 <- aggregate(sal~loc, x, sum)
result2
pct <- round(result2$sal/sum(emp$sal)*100, 1)
loc_label <- paste(result2$loc, ':',pct,'%')

pie(result, col=rainbow(3), labels = loc_label)

# python
x = pd.merge(emp, dept, on = 'deptno')
x2 = x.pivot_table(columns = 'loc', values = 'sal', aggfunc = 'sum')
x2.iloc[0,:].plot(kind='pie',autopct = '%0.0f%%')
	#또는
x = pd.merge(emp, dept, on = 'deptno')
x = x.groupby('loc')['sal'].sum().reset_index()
x['sal'].plot(kind = 'pie', labels = x['loc'], autopct = '%0.0f%%')

반응형