본문 바로가기

R

SQL과 R과 비교(연산자)

728x90
반응형

R에서 사용하는 연산자 총정리

1. 산술연산자 : *  /  +  -

2. 비교연산자 : >  <  >=  <=  ==  !=

3. 논리연산자 : &  : and(벡터화된 연산)

    && : and(벡터화되지 않은 연산)

      |   : or(벡터화된 연산)

     ||   : or(벡터화되지 않은 연산)

      !  : not

 

 

 

벡터화 연산    VS    벡터화되지 않은 연산

:

> x   <-  c(1,2,3)

> x   <-  c(1,2,3)

> x   >  c(1,1,1)  &  x < c (3,3,3)

[1] FALSE  TRUE FALSE

1차원 행렬이사 벡터연산자 사용

 

 

> x  <- 1

> x > -2 && x<2

[1] TRUE

※그냥 숫자는 행렬도 뭐도 아닌다. 1차원 아니므로

   벡터아닌 연산자를 사용한다.

 

 

 

 

 

작업 디렉토리 변경 emp.csv 로드 하는 방법

> setwd("d:\\data")

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

> emp

 

 

 

기본 데이터 검색

 

문제1. emp 데이터 프레임에서 이름, 월급을 출력하시오

 

>emp[, ]

>emp[    ,    c("ename","sal")]

                   

    combine

 

 

문제2. 월급이 3000 사원들의 이름.월급을 출력하시오

 

emp[ emp$sal==3000, c("ename","sal")]

   ename  sal

8  SCOTT 3000

13  FORD 3000

 

$ 붙여서 일일이 작업하는게 싫으면

attach(emp)

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

 

그럼 이제 테이블명 $ 안해도 알아서 한다.

 

 

 

문제3. 월급이 2000 이상인 사원들의 이름. 월급을 출력하시오

emp[sal>=2000, c("ename","sal")]

 

 

 

 

 

문제4. 직업이 SALESMAN 아닌 사원들의 이름,월급, 직업을 출력하시오

 

> emp[job!='SALESMAN', c('ename','sal','job')]

    ename  sal       job

1   SMITH  800     CLERK

4   JONES 2975   MANAGER

6   BLAKE 2850   MANAGER

7   CLARK 2450   MANAGER

8   SCOTT 3000   ANALYST

9    KING 5000 PRESIDENT

11  ADAMS 1100     CLERK

12  JAMES  950     CLERK

13   FORD 3000   ANALYST

14 MILLER 1300     CLERK

15   JACK 3200     CLERK

 

 

 

 

문제5. 직업이 SALESMAN 이고 월급이 1000 이상인 사원들의

이름,월급,직업을 출력하시오

emp[job=='SALESMAN' & sal>=1000, c('ename','sal','job')]

& 한개써야한다.

 

 

 

 

 

■ R shiny 활용가능한 코드

 

runExample("01_hello")

runExample("02_text")

runExample("03_reactivity")

runExample("04_mpg")

runExample("05_sliders")

runExample("06_tabsets")

runExample("07_widgets")

runExample("08_html")

runExample("09_upload")

runExample("10_download")

runExample("11_timer")

 

 


 

 

 

연결연산자

SQL     ||

R          data.table(paste(....) )

 

 

문제6. 아래와 같이 결과를 출력 하시오

SQL> select ename || " 직업은" || job

from emp;

 

intall.packages("data.table")

library(data.table)

data.table(paste(emp$ename, ' 직업은', emp$job) )

#emp$ 빼도 (아까 attach 선언해놓아서)

 1:     SMITH 의 직업은 CLERK
 2:  ALLEN 의 직업은 SALESMAN
 3:   WARD 의 직업은 SALESMAN
 4:   JONES 의 직업은 MANAGER
 5: MARTIN 의 직업은 SALESMAN
 6:   BLAKE 의 직업은 MANAGER
 7:   CLARK 의 직업은 MANAGER
 8:   SCOTT 의 직업은 ANALYST
 9:  KING 의 직업은 PRESIDENT
10: TURNER 의 직업은 SALESMAN
11:     ADAMS 의 직업은 CLERK
12:     JAMES 의 직업은 CLERK
13:    FORD 의 직업은 ANALYST
14:    MILLER 의 직업은 CLERK
15:      JACK 의 직업은 CLERK

 

 

 

 

기타 비교 연산자

 

SQL

VS

R

1

in

 

%in%

2

like

 

grep

3

is null

 

is.na

4

between..and

 

emp$sal >= 1000 &
emp$sal <= 3000

 

 

 

문제7. 직업이 SALESMAN, ANALYST 사원들의 이름,직업을

출력하시오

>emp[, ]

 

emp[emp$job %in% c('SALESMAN','ANAYLST'), c('ename','job')]

*atttach 선언 안해주면 emp$ 붙여주면서 시작!

 

emp[job %in% c('SALESMAN','ANAYLST'), c('ename','job')]

                         

combine

 

    ename      job
2   ALLEN SALESMAN
3    WARD SALESMAN
5  MARTIN SALESMAN
10 TURNER SALESMAN

 

 

 

 

 

문제8. 직업이 SALESMAN , ANALYST 아닌 사원들의 이름,직업을 출력하시오

 

emp[!job %in% c('SALESMAN','ANAYLST'), c('ename','job')]

 

조건 컬럼 job 앞에 ! 붙인다.  ( ! not 의미)

 

 

 

 

문제9. 커미션이 null 사원들의 이름,월급,커미션을 출력하시오

 

> emp[is.na(comm), c('ename','sal','comm')]
    ename  sal comm
1   SMITH  800   NA
4   JONES 2975   NA
6   BLAKE 2850   NA
7   CLARK 2450   NA
8   SCOTT 3000   NA
9    KING 5000   NA
11  ADAMS 1100   NA
12  JAMES  950   NA
13   FORD 3000   NA
14 MILLER 1300   NA
15   JACK 3200   NA

 

 

R에서의 null :

1. NULL (아무것도 없다) ---> is.null( )  *빈깡통 같은!

2. NA    (결손값) -----------> is.na( )

              

어느 부분이 없거나 잘못되서 불완전한 상태

대부분 NA 쓴다.(NA '모르는 ' 가까움)

 

3. NaN (비수치)

                  

 Not a Number 약자로, 숫자가 아니다 라는 .

 

 

 

R에서 NULL(아무것도 없다) 활용할 때는

반복문으로 처리할 오브젝트의 초기값을 NULL 설정

 

예문:

x <- NULL

for (i  in 1:10)   x <- append(x, i*i)

x

[1]   1   4   9  16  25  36  49  64  81 100

 

 

 

 

문제10. 커미션이 NA 아닌 사원들의 이름,월급,커미션을 출력하시오

 

is.null 출력한 경우:

> emp[!is.null(comm), c('ename','sal','comm')]
    ename  sal comm
1   SMITH  800   NA
2   ALLEN 1600  300
3    WARD 1250  500
4   JONES 2975   NA
5  MARTIN 1250 1400
6   BLAKE 2850   NA
7   CLARK 2450   NA
8   SCOTT 3000   NA
9    KING 5000   NA
10 TURNER 1500    0
11  ADAMS 1100   NA
12  JAMES  950   NA
13   FORD 3000   NA
14 MILLER 1300   NA
15   JACK 3200   NA

 

, 빈깡통이 아닌값을 가져오라는 건데,

숫자 또는 알수없는 값이 기재되어 있기 때문에

모든값이 출력된다.

 

:

> emp[!is.na(comm), c('ename','sal','comm')]
    ename  sal comm
2   ALLEN 1600  300
3    WARD 1250  500
5  MARTIN 1250 1400
10 TURNER 1500    0

 

 

 

 

문제11. 이름의 첫번째 글자가 A 시작하는 사원들의 이름,월급을

출력하시오

> emp[grep("^A.*", ename), c("ename", "sal")]  

    ename  sal
2  ALLEN 1600
11 ADAMS 1100

 

설명

^ : 첫번째

$ : 마지막

. : 한자리

* : wild card(%)

 

 

문제12. 이름의 끝글자가 T 끝나는 사원들의 이름,월급을 출력하시오

emp[grep("*T$", ename), c("ename", "sal")]

* 빼도 출력됨

 

 

 

문제13. (점심시간문제)

이름의 두번째 철자가 M 사원들의 이름,월급을 출력하시오

> emp[grep("^.M.*", ename), c("ename", "sal")]
  ename sal
1 SMITH 800

 

 

 

 

 

 

중복제거

 

SQL

VS

R

 

distinct

 

unique

 

 

 

> unique(deptno)
[1] 20 30 10 70
> library(data.table)
> data.table("부서번호"=unique(emp$deptno))
   부서번호
1:       20
2:       30
3:       10
4:       70

 

 

 

정렬 작업

SQL

vs

R

order by

 

1. data frame 에서 order 옵션

2. doBy 패키지를 설치하고

   orderBy 함수를 사용

 

 

 

문제15. 이름,월급을 출력하는데 월급이 높은 사원부터 출력하시오

 

emp[order(emp$sal, decreasing=T), c("ename", "sal")]

 

Data frame : emp[ ,  ]

 

 

 

 

 

문제16. 이름,입사일을 출력하는데 먼저 입사한 사원부터 출력하시오

 

emp[order(emp$hiredate, decreasing=F), c("ename", "hiredate")]

 

 

 

 

문제17. 직업이 SALESMAN 사원들의 이름,월급,직업을 출력하는데

월급이 높은 사원부터 출력하시오

 

오답:

emp[job=="SALESMAN" , order(sal, decreasing=T) , c("ename", "sal","job")]

*원하는 행을 지정하는 것과 정렬을 조건절에 함께 없다.

 

*R 변수에 담아서 작성할 있다.

 

:

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

str(x)    # 그냥 x 써도 desc !

x[order(x$sal,decreasing=T), ]

*열자리 써도 되고, 안쓰면 출력

 

*모든 변수를 보고 싶을

> ls()
 [1] "body"        "current_dir" "data_pro"    "emp"         "i"         
 [6] "package_in"  "packages"    "server"      "sidebar"     "ui"        
[11] "x"

 

변수 지우고 싶으면?

rm(변수이름)

 

 

변수 다지우고 싶으면?

rm(list=ls())

 

 

 

문제18. 이름, 월급을 출력하는데 월급이 높은 사원순으로 출력하는 것을

 doBy 패키지를 이용해서 출력하시오

 

install.packages("doBy")

library(doBy)

orderBy(~sal, emp[  , c("ename", "sal" ) ] )

 

 

> orderBy(~sal, emp[  ,c("ename","sal")])
    ename  sal
1   SMITH  800
12  JAMES  950
11  ADAMS 1100
3    WARD 1250
5  MARTIN 1250
14 MILLER 1300
10 TURNER 1500
2   ALLEN 1600
7   CLARK 2450
6   BLAKE 2850
4   JONES 2975
8   SCOTT 3000
13   FORD 3000
15   JACK 3200
9    KING 5000

 

 

 

 

 

 

 

문제19. 직업이 ANALYST 아닌 사원들의 이름,월급, 직업을

출력하는데 월급이 높은 사원부터 출력하시오 !

 

orderBy(~-sal, emp[job!="ANALYST"  ,c("ename","sal", "job")])

 

설명

물결 : 낮은 순서대로

물결- : 높은 순서대로

 

 

 

 

 

 

문제20. 카페에서 crime_loc.csv 내려받고 R 로드한 후에

살인이 일어나는 장소와 건수를 출력하는데

살인이 일어나는 건수가 높은 것부터 출력하시오

 

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

attach(crime_loc)

crime_loc

orderBy(~-건수, crime_loc[ crime_loc$범죄 == '살인', c('장소','건수')])

 

*앞에 head 붙이면 상단 6개만 있다

head(orderBy(~-건수, crime_loc[ crime_loc$범죄 == '살인', c('장소','건수')]) )

 

       장소 건수
83          312
85      노상  280
82    아파트  242
108     기타  131
89      병원   87
88  숙박업소   43

 

 

 

문제21. 범죄의 유형이 무엇이 있는지 중복제거해서 출력하시오

unique(crime_loc)

 

 

 

문제22. 부서번호가 10, 20번인 사원들의 이름, 월급과 부서번호를

출력하는데 월급이 높은 사원부터 출력하시오

orderBy(~-sal, emp[emp$deptno %in% c(10,20), c("ename",'sal',"deptno")] )

 

 


728x90
반응형

'R' 카테고리의 다른 글

SQL과 R과 비교(그룹함수)  (0) 2019.03.09
SQL과 R과 비교(함수)  (0) 2019.03.09
R의 자료구조  (0) 2019.03.09
R 설치 및 R studio, R shiny 설치  (0) 2019.03.09
R을 왜 배워야 하는지?  (0) 2019.03.09