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%%')
반응형
'Study > class note' 카테고리의 다른 글
코바코 웹스크롤링 (0) | 2022.01.21 |
---|---|
R / 조인(outer join, self join, 조직도 시각화), pivot_table, tapply, 집합연산자 (0) | 2022.01.20 |
R / 막대그래프, 원형그래프 (0) | 2022.01.19 |
R / 그룹함수, aggregate, tapply, table, format (0) | 2022.01.19 |
R / 문자함수(gsub), 날짜함수, 변환함수, 일반함수, 그룹함수 (0) | 2022.01.18 |