■ 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 & |
문제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")] )
'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 |