■ R로 서브쿼리 구현하기
*오라클의 서브쿼리 3가지
1. single row subquery
2. multiple row subquery
3. multiple column subquery
문제97. JONES 의 월급보다 더 많은 월급을 받는 사원들의 이름, 월급을
출력하시오
SQL> select ename, sal
from emp
where sal > (select sal
from emp
where ename="JONES");
x<-emp[ename=="JONES",
c("ename","sal")]
> x
ename sal
4 JONES 2975
> emp[sal>x$sal,
c("ename","sal")]
ename sal
8 SCOTT 3000
9 KING 5000
13 FORD 3000
15 JACK 3200
문제98. 사원테이블에서 가장 많은 월급을 받는 사원의 이름,월급,직업을
출력하시오
x<-emp[sal==max(sal),
c("ename","sal","job")]
> x
ename sal
job
9 KING 5000 PRESIDENT
문제99. 전국에서 등록금이 가장 비싼 학교이름과 등록금을 출력하시오
(전국_대학별등록금통계_현황.csv)
global=read.csv("전국_대학별등록금통계_현황.csv",
header=T)
> head(global)
구분 설립유형 학교명 본분교구분 입학금 수업료.A. 기성회비.B.
등록금.A.B.
1 대학 사립 가야대학교
본교 0.0 5606.0 0 5606
2 대학 사립 가야대학교
제2캠퍼스 621.0 6670.5 0 6671
3 대학 사립 가천대학교
본교 878.3 8250.1 0 8250
4 대학 사립 가톨릭대학교 본교
880.0 6901.9 0 6902
5 대학 사립 가톨릭대학교 제2캠퍼스
880.0 8111.3 0 8111
6 대학 사립 가톨릭대학교 제3캠퍼스
880.0 6122.0 0 6122
> global[global$등록금.A.B. == max(global$등록금.A.B.),
c("학교명", "등록금.A.B.")]
학교명
등록금.A.B.
86 명지대학교 자연캠퍼스 9117
> global[global$등록금.A.B. == max(global$등록금.A.B.), ]
구분 설립유형 학교명 본분교구분 입학금 수업료.A. 기성회비.B.
등록금.A.B.
86 대학 사립 명지대학교 자연캠퍼스 본교
880 9117 0 9117
문제100. KING 에게 보고하는 사원들의 이름,월급을 출력하시오
KING_EMPNO<-emp[ename=="KING","empno"]
> KING_EMPNO
[1] 7839
> emp[emp$mgr==KING_EMPNO,
c("ename","sal")]
ename sal
4 JONES 2975
6 BLAKE 2850
7 CLARK 2450
NA <NA> NA
> na.omit(emp[emp$mgr==KING_EMPNO,
c("ename","sal")])
ename sal
4 JONES 2975
6 BLAKE 2850
7 CLARK 2450
문제101.
관리자인 사원들의 이름을 출력하시오
emp[emp$empno %in%
emp$mgr, c("ename")]
[1] JONES BLAKE CLARK SCOTT KING
FORD
15 Levels: ADAMS ALLEN BLAKE CLARK FORD JACK JAMES JONES KING MARTIN MILLER
SCOTT ... WARD
**보기 안좋다. data.table을 씌워서 보기좋게 뽑자 !
> data.table( emp[emp$empno %in% emp$mgr,
c("ename")] )
V1
1: JONES
2: BLAKE
3: CLARK
4: SCOTT
5: KING
6: FORD
문제102. 관리자가 아닌 사원들의 이름을 출력하시오
data.table( emp[!emp$empno %in% emp$mgr,
c("ename")] )
V1
1: SMITH
2: ALLEN
3: WARD
4: MARTIN
5: TURNER
6: ADAMS
7: JAMES
8: MILLER
9: JACK
**느낌표가 not 이다
문제103. 작년에 아파트에서 가장 많이 발생한 범죄 유형이 무엇인지
출력하시오(crime_loc.csv 사용)
x<-crime_loc[crime_loc$장소=="아파트" ,
c("범죄","장소","건수")]
> head(x)
범죄 장소
건수
1 절도 아파트 25389
28 장물 아파트 88
55 손괴 아파트 3122
82 살인 아파트 242
109 강도 아파트 372
136 방화 아파트 354
> data.table( x[x$건수==max(x$건수),] )
범죄 장소
건수
1: 절도 아파트 25389
문제104.(점심시간 문제)
강력범죄가 가장 많이 발생하는 요일은 언제인가?
(crime_day.csv)
crime_day=read.csv("crime_day.csv",
header=T)
> head(crime_day)
C_C C_T
DAY CNT
1 강력범죄 살인기수 SUN
46
2 강력범죄 살인기수 MON
66
3 강력범죄 살인기수 TUE
52
4 강력범죄 살인기수 WED
66
5 강력범죄 살인기수 THUR 41
6 강력범죄 살인기수 FRI 34
> x<-crime_day[crime_day$C_C=="강력범죄 " ,
c("C_C","C_T","DAY", "CNT")]
> head(x)
C_C C_T
DAY CNT
1 강력범죄 살인기수 SUN
46
2 강력범죄 살인기수 MON
66
3 강력범죄 살인기수 TUE
52
4 강력범죄 살인기수 WED
66
5 강력범죄 살인기수 THUR 41
6 강력범죄 살인기수 FRI 34
> x2<-aggregate(x$CNT~x$DAY,x, sum)
> x2
x$DAY x$CNT #
<<---- 이것 때문에 names 가 필요하다
1 FRI
3776
2 MON
3704
3 SAT
4262
4 SUN
3997
5 THUR
3744
6 TUE
3713
7 WED
3766
>
names(x2)<-c("DAY","CNT")
> x2
DAY CNT
1 FRI 3776
2 MON 3704
3 SAT 4262
4 SUN 3997
5 THUR 3744
6 TUE 3713
7 WED 3766
>
x2[x2$CNT==max(x2$CNT),c("DAY","CNT")]
DAY CNT
3 SAT 4262
■ 순위 출력을 R로 구현하는 방법
오라클 |
VS |
R |
dense_rank |
|
rank |
문제105. 이름, 월급, 월급에 대한 순위를 출력하시오
※ min : 오라클의 rank 와 같다
first : 오라클의 rank 와 같은데 순위가 같은 데이터가 있으면
인덱스 순서가 먼저 나온 데이터를 높은 순위로 부여한다.
예:
인덱스 이름 월급 순위
2 : FORD 3000 2
3 : SCOTT 3000 3
data.table(emp$ename,
emp$sal,
+ rank(-emp$sal,
ties.method="min"))
V1 V2 V3
1:
SMITH 800 15
2:
ALLEN 1600 8
3:
WARD 1250 11
4:
JONES 2975 5
5: MARTIN 1250 11
6:
BLAKE 2850 6
7:
CLARK 2450 7
8:
SCOTT 3000 3
9:
KING 5000 1
10: TURNER 1500 9
11: ADAMS 1100 13
12: JAMES 950 14
13: FORD 3000 3
14: MILLER 1300 10
15: JACK 3200 2
문제106. 위 답을 정렬해서 출력하시오
x<-data.table(emp$ename, emp$sal,
+ rank(-emp$sal,
ties.method="min"))
>
names(x)<-c("ename","sal","ran")
> orderBy(~ran, x)
ename sal ran
1:
KING 5000 1
2:
JACK 3200 2
3:
SCOTT 3000 3
4:
FORD 3000 3
5:
JONES 2975 5
6:
BLAKE 2850 6
7:
CLARK 2450 7
8:
ALLEN 1600 8
9: TURNER 1500 9
10: MILLER 1300 10
11: WARD 1250 11
12: MARTIN 1250 11
13: ADAMS 1100 13
14: JAMES 950
14
15: SMITH 800 15
orderBy(~-x$ran, x)
Error in `[.data.frame`(x, i, j) : undefined
columns selected
ties.method="min" 여기를
ties.method="fisrt" 라고 바꾸면
x<-data.table(emp$ename, emp$sal,
+ rank(-emp$sal,
ties.method="first"))
>
names(x)<-c("ename","sal","ran")
> orderBy(~ran, x)
ename sal ran
1:
KING 5000 1
2:
JACK 3200 2
3:
SCOTT 3000 3
4:
FORD 3000 4
5:
JONES 2975 5
6:
BLAKE 2850 6
7:
CLARK 2450 7
8:
ALLEN 1600 8
9: TURNER 1500 9
10: MILLER 1300 10
11: WARD 1250 11
12: MARTIN 1250 12
13: ADAMS 1100 13
14: JAMES 950
14
15: SMITH 800 15
※ ties.method="min" 은 동률등수 허용
ties.method="first" 는 dense_rank 랑 같음
문제107. 여자들이 많이 걸리는 암의 건수, 순위를 출력하시오
(cancer2.csv 사용)
cancer=read.csv("cancer2.csv", header=T)
head(cancer)
unique(cancer2$성별)
[1] 남녀전체 남자 여자
cancer2<-cancer[cancer$성별=="여자" & cancer$암종!="모든암",]
head(cancer2)
x<-data.table(cancer2$암종, cancer2$환자수,
rank(-cancer2$환자수, ties.method="min"))
head(x)
names(x) <- c("암", "건수", "순위")
x
head(orderBy(~순위, x))
암 건수
순위
1: 갑상선 217874 1
2: 갑상선 217874 1
3: 유방 131581 3
4: 유방 131581 3
5: 대장
69971 5
6: 대장
69971 5
문제108.
2009년도에 서울시에서 교통사고가 일어난 장소,건수,순위를 출력하시오
(car_accident.csv)
car=read.csv("car_accident.csv",header=T)
x <- car[ car$year2 == 2009 & car$loc == '서울',]
x
y <- data.table( x$loc , x$loc_desc, x$cnt , rank( -x$cnt , ties.method = 'min'))
names(y) <- c("지역","상세지역","건수","순위")
orderBy(~순위, y)
지역
상세지역 건수 순위
1: 서울 박내과옆
먹자골목 66 1
2: 서울
서울 60 2
3: 서울
역삼역교차로 56 3
4: 서울
교보생명사거리 54 4
5: 서울 남부순환도로
신림4거리 50 5
---
3541: 서울
GS칼텍스 앞 횡단보도 부근 2
2948
3542: 서울
지디리얼에스테이트 2 2948
3543: 서울
훼미리마트편의점앞 횡단보도 2
2948
3544: 서울
강동가톨릭병원 앞 횡단보도 2 2948
3545: 서울 한강시민공원 만남의 광장 자전거대여점 앞 한강시민공원 내 자
2 2948
'R' 카테고리의 다른 글
그래프(원형,막대) (0) | 2019.03.09 |
---|---|
SHINY 해체 (0) | 2019.03.09 |
SQL과 R과 비교(조인) (0) | 2019.03.09 |
SQL과 R과 비교(그룹함수) (0) | 2019.03.09 |
SQL과 R과 비교(함수) (0) | 2019.03.09 |