본문 바로가기

R

SQL과 R과 비교(그룹함수)

728x90
반응형

 

Oracle

VS

R

1

max

 

max

2

min

 

min

3

sum

 

sum

4

avg

 

mean

5

count

 

length(세로)

table(가로)

 

문제48. 최대 월급을 출력하시오

 max(sal)
[1] 5000

 

 

 

 

 

문제49. 직업이 SALESMAN 사원들 중에서 최대월급을 출력하시오

 

x <- emp[ job=='SALESMAN', c('sal') ]

x2 <- max(x)

emp[sal ==x2 , c("ename", "sal")]

 

 

 

 

문제50. 직업, 직업별 최대월급을 출력하시오

SQL> select job, max(sal)

from emp

group by job;

 

aggregate(sal~job, emp, max)
        job  sal
1   ANALYST 3000
2     CLERK 3200
3   MANAGER 2975
4 PRESIDENT 5000
5  SALESMAN 1600

 

 

aggregate      (sal     ~    job,        emp,       max)

                                             

그룹화    조건받는값   그룹대상    테이블     조건

 

 

문제51. 부서번호, 부서번호별 최소월급을 출력하시오

aggregate(sal~deptno, emp, min)
  deptno  sal
1     10 1300
2     20  800
3     30  950
4     70 3200

 

 

문제52. 부서번호, 직업, 토탈월급을 출력하시오

aggregate(sal~deptno+job, emp, sum)
   deptno       job  sal
1      20   ANALYST 6000
2      10     CLERK 1300
3      20     CLERK 1900
4      30     CLERK  950
5      70     CLERK 3200
6      10   MANAGER 2450
7      20   MANAGER 2975
8      30   MANAGER 2850
9      10 PRESIDENT 5000
10     30  SALESMAN 5600

 

 

 

 

문제53. 부서번호, 부서번호별 최대월급을 출력하는데

부서번호별 최대월급이 높은것부터 출력하시오

 

orderBy(~-sal, aggregate(sal~deptno, emp, sum) )
  deptno   sal
2     20 10875
3     30  9400
1     10  8750
4     70  3200

 

x <- aggregate(sal~deptno,emp,max)

x

orderBy(~-sal ,x[,c('deptno','sal')])

 

 

 

문제54. 위의 컬럼명을 한글로 부서번호, 토탈월급으로 변경하시오

 

 x <- orderBy(~-sal, aggregate(sal~deptno, emp, max) )
> names(x) <- c("부서번호", "토탈월급")
> names(x)
[1] "부서번호" "토탈월급"
> x
  부서번호 토탈월급
1       10     5000
4       70     3200
2       20     3000
3       30     2850

 

 

 

 

 

 

55. emp테이블을 세로, 가로로 출력하시오

 

1. 세로로 출력

aggregate(empno~job, emp, length)

length :

 

 job empno
1   ANALYST     2
2     CLERK     5
3   MANAGER     3
4 PRESIDENT     1
5  SALESMAN     4

 

 

 

2. 가로로 출력

table(emp$job)

job
  ANALYST     CLERK   MANAGER PRESIDENT  SALESMAN
        2         5         3         1         4

 

 

 

 

문제56. 위의 결과를 막대 그래프로 그리시오

 

x <- table(emp$job)

barplot(x, main="persons per job", col=rainbow(5), density=50)

 

 


 

 

 

문제57. 직업, 직업별 평균월급을 출력하시오

(가로 , 세로)

세로는 aggregate 그대로 쓰면

 

 

세로

aggregate(empno~job, emp, mean)
        job  empno
1   ANALYST 7845.0
2     CLERK 8074.2
3   MANAGER 7682.0
4 PRESIDENT 7839.0
5  SALESMAN 7629.5

 

그룹+가로

tapply(emp$sal, emp$job, mean)
  ANALYST     CLERK   MANAGER PRESIDENT  SALESMAN
 3000.000  1470.000  2758.333  5000.000  1400.000

 

 

 

 

문제58. 위의 결과를 다시 출력하는데 소숫점 이하는 안나오게 하시오

 

x<-aggregate(sal~job, emp, mean)

data.table('JOB'=x$job, 'MEAN_SAL'=trunc(x$sal) )

JOB MEAN_SAL
1:   ANALYST     3000
2:     CLERK     1470
3:   MANAGER     2758
4: PRESIDENT     5000
5:  SALESMAN     1400

 

 

x2<-tapply(emp$sal, emp$job, mean)

trunc(x2)

 

 

 

문제59. 입사한 년도, 입사한 년도별 평균월급을 가로로 출력하시오

x2<-tapply(emp$sal, emp$hiredate, mean)
> trunc(x2)
1980-12-17 1981-02-20 1981-02-22 1981-04-02 1981-05-01 1981-06-09 1981-09-08 1981-09-28
       800       1600       1250       2975       2850       2450       1500       1250
1981-11-17 1981-12-03 1982-01-23 1987-04-19 1987-05-23
      5000       1975       2250       3000       1100

 

근데 이건 날짜별로 한거라서 그룹화한 의미가 없어짐

 

x2<-tapply(sal, year(hiredate), mean)
> trunc(x2)
1980 1981 1982 1987
 800 2282 2250 2050

 

*year 지정하면 년도별로 그룹화 시킴

 

 

 

문제60. 위의 결과를 막대그래프로 그리시오

 

x2<-tapply(sal, year(hiredate), mean)

barplot(x2, main="Year per Mean_Sal", col=rainbow(4), density=50)

 

 

 

문제61. 직업, 부서번호, 직업별 부서번호별 토탈월급을 가로로 출력하시오

세로방법:

aggregate(sal~deptno+job, emp, sum)

 

:

tapply(sal, list(job, deptno), sum)
            10   20   30   70
ANALYST     NA 6000   NA   NA
CLERK     1300 1900  950 3200
MANAGER   2450 2975 2850   NA
PRESIDENT 5000   NA   NA   NA
SALESMAN    NA   NA 5600   NA

 

 

 

 

문제62. 위의 결과중에 NA 0으로 출력되게 하시오

 

x<-tapply(sal, list(job, deptno), sum)
> x[is.na(x) ] <- 0
> x
            10   20   30   70
ANALYST      0 6000    0    0
CLERK     1300 1900  950 3200
MANAGER   2450 2975 2850    0
PRESIDENT 5000    0    0    0
SALESMAN     0    0 5600    0

 

 

 

 

문제63. 직업, 입사한 년도(4자리), 직업별 입사한 년도별 토탈월급을 출력하시오

 

x<-tapply(sal, list(job, year(hiredate)), sum)
> x[is.na(x)] <- 0
> x
          1980 1981 1982 1987
ANALYST      0 3000    0 3000
CLERK      800  950 4500 1100
MANAGER      0 8275    0    0
PRESIDENT    0 5000    0    0
SALESMAN     0 5600    0    0

 

 

 

 

문제64. 위의 결과에서 column name row name 각각 출력하시오

 

x<-tapply(sal, list(job, year(hiredate)), sum)
> x[is.na(x)] <- 0

 x
          1980 1981 1982 1987
ANALYST      0 3000    0 3000
CLERK      800  950 4500 1100
MANAGER      0 8275    0    0
PRESIDENT    0 5000    0    0
SALESMAN     0 5600    0    0

 

> colnames(x)
[1] "1980" "1981" "1982" "1987"
> rownames(x)
[1] "ANALYST"   "CLERK"     "MANAGER"   "PRESIDENT" "SALESMAN"

 

 

 

문제65. 문제의 결과를 막대그래프로 그리시오

x<-tapply(sal, list(job, year(hiredate)), sum)

x[is.na(x)] <- 0

colnames(x)

rownames(x)

barplot(x, col=rainbow(7), legend=rownames(x), beside=T)

 

 

 

-legend 오른쪽 허공에 떠있는 작은박스

-beside False 하면 다르게 분할함

 

 


 

 

 

 

문제66. 직업, 직업별 토탈월급을 원형(pie) 그래프로 그리시오

 

x<-tapply(sal, job, sum)

pie(x, col=rainbow(4), density=80)

 

 

 

문제67. 위의 그래프를 3D 출력하시오

install.packages("plotrix")

library(plotrix)

pie3D(x, explode=0.1, labels=rownames(x))

 


 

 

 

문제68. 문제 시각화 결과 , 직업 옆에 비율도 같이 출력되게 하시오

x<-tapply(sal, job, sum)

x2<-aggregate(sal~job, emp, sum)

 

pct<-round(x2$sal/sum(emp$sal)*100, 1)

pct

 

lbls <-x2$job

lbls

 

lbls2<-paste(lbls, ':', pct, '%')

lbls2

 

pie3D(x, explode=0.1, labels=lbls2)

 

 

 


 

 

 

문제69. crime_loc.csv 가지고 범죄유형이 살인인 장소와 건소를 출력하시오

crime_loc <-read.csv("crime_loc.csv", header=T)

attach(crime_loc)

head(crime_loc[범죄=="살인", c("장소","건수")])
       장소 건수
82   아파트  242
83         312
84 고속도로    1
85     노상  280
86     상점   23
87 시장노점    5

 

 

 

 

문제70. 위의 결과를 x5 변수에 담고 아래의 결과로 막대그래프를

그리시오

 

head(crime_loc[범죄=="살인", c("장소","건수")])

 

x5 <- crime_loc[범죄=="살인", c("장소","건수")]

head(x5)

x6 <- tapply(x5$건수, x5$장소, sum)

x6

barplot(x6,col=rainbow(7), beside=T )

 

 

tapply 가로화 안하면

Error in barplot.default(x5, col = rainbow(7), beside = T) :
  'height'는 반드시 벡터 또는 행렬이어야 합니다

 

 

 

 문제72. tapply 함수를 이용해서 전통시장과 대형마트간의 물품별

가격 평균을 출력하시오

 

price<-read.csv("price.csv", header=T)

head(price)

attach(price)

 

x<-tapply(A_PRICE, list(A_NAME, M_TYPE_NAME), mean)

x[is.na(x)] <- 0

trunc(x)

 

                    대형마트 전통시장
고등어                  3313     3000
고등어(30cm,국산)       5020     3140
고등어(30cm,수입산)     3980       NA
고등어(냉동,국산)       3873     3415
고등어(냉동,수입산)     2430     2500
고등어(생물,국산)       4700     3308

 

 

 

 

문제73. 위의 결과를 다시 출력하는데 가격이 높은것부터 출력되게 하는데

대형마트를 기준으로 출력되게 하시오

 

head(orderBy(~-대형마트, x))
                    대형마트 전통시장
쇠고기(육우,불고기)    23400    15141
쇠고기(한우,불고기)    22338    17773
쇠고기                 20280        0
쇠고기(한우1등급)      19779    19800
쇠고기(한우2등급)      18500    15640
돼지고기(생삼겹살)     11330     9705

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


728x90
반응형

'R' 카테고리의 다른 글

SQL과 R과 비교(서브쿼리)  (0) 2019.03.09
SQL과 R과 비교(조인)  (0) 2019.03.09
SQL과 R과 비교(함수)  (0) 2019.03.09
SQL과 R과 비교(연산자)  (0) 2019.03.09
R의 자료구조  (0) 2019.03.09