R
여기서는 R 프로그래밍 언어를 실습합니다.
기초 예제
편집Hello world 출력하기
> "Hello world"
[1] "Hello world"
CSV 파일 읽기
# 1행에 열이름을 넣었을 경우 header=T 옵션을 줘서 이름을 인식시킬 수 있다.
> df <- read.csv("a.csv", header = T)
기본 연산
> x <- c(1, 2, 3, 4, 5, 6) # 벡터x 정의
> y <- x^2 # 벡터x의 제곱을 y로 정의
> print(y) # 벡터y 출력
[1] 1 4 9 16 25 36
> mean(y) # 벡터y의 (산술)평균
[1] 15.16667
> median(y) # 벡터y의 중앙값
[1] 12.5
> var(y) # 벡터y의 분산
[1] 178.9667
실습하기
편집단축키
편집- Ctrl+↵ Enter: 해당 블록, 커서가 있는 줄의 코드 실행
- Ctrl+⇧ Shift+C: 주석 생성 또는 제거
- Ctrl+⇧ Shift+N: 새로운 script 창 생성
- Ctrl+A: 스크립트 전체 행 선택
- Ctrl+D: 해당 줄 삭제
- Ctrl+⇧ Shift+M: (dplyr) 패키지 안의 pipe 함수 %>%
변수 할당
편집1. 변수 할당 및 출력
편집- 변수 할당 방법
- ' <- '
- ' = '
할당 연산자 중 '='는 명령의 최상위 수준에서만 사용할 수 있는 반면 '<-'는 어느 곳에서나 사용할 수 있다.
만약 '='를 사용한다면 경우에 따라 표현력에 한계가 있을 수 있기 때문에 변수에 값을 할당 할 때 '='보다는 '<-'를 사용하는 것이 좋다.
Ex)
> x<-3 # x라는 변수 명에 3이라는 값이 할당 됨.
> z=5 # z라는 변수 명에 5라는 값이 할당 됨.
> jeon<-"MinJae" # jeon이라는 변수 명에 MinJae 라는 문자가 할당 됨.
- 변수 출력 방법
- 변수명 직접 호출
- *print()
- *cat()
print 함수와 cat 함수 모두 객체를 출력할 때 사용하는 함수이지만 약간의 차이가 있다.
print()는 결과를 출력한 뒤 개행(줄바꿈)이 일어나는 반면, cat()은 행을 바꾸지 않고 그대로 출력한다.
Ex)
> x
[1] 3
> z
[1] 5
> for (i in 1:3) print(i)
[1] 1
[1] 2
[1] 3
> for (i in 1:3) cat(i)
123
2. 변수 명 규칙
편집- 변수 명은 특수문자 중 '.'(마침표), '_'(언더바), 영어, 숫자만 사용 가능
- 변수 명은 숫자나 '_'(언더바)로 시작 불가
- 변수명이 '.'(마침표)로 시작할 경우 바로 뒤엔 영어가 와야 함
Ex)
> var_name.1<-3 # 변수 명 설정 가능, 첫 번째 조건
> .var_name.2<-3 # 변수 명 설정 가능, 세 번째 조건
> .2var.name<-3 # 변수 명 설정 불가능, 셋째 조건 불만족
> %var.name2<-3 # 변수명 설정 불가능, 첫째 조건 불만족
> 2var.name<-3 # 변수명 설정 불가능, 둘째 조건 불만족
3. 데이터 타입
편집R에서 사용되는 데이터 타입에는
Numeric(숫자), Character(문자), Logical(논리), NA/NULL이 있다.
- Numeric
- 숫자형 타입
- numeric, integer 두 개의 타입이 존재(numeric의 경우 실수, integer의 경우 정수로 표현)
- 특별히 지정하지 않는 경우 변수는 numeric으로 설정
- Character
- 문자형 타입
- Character, factor 두 개의 타입이 존재(character의 경우 문자, factor의 경우 level이 존재하는 문자로 표현)
- ""(큰따옴표) 혹은 ''(작은따옴표)를 사용하면 문자형 타입으로 취급
- factor의 경우 범주형 데이터를 표현하기 위한 데이터 타입
- Logical
- 논리형 타입
- TRUE, FALSE 두 가지 타입이 존재(TRUE의 경우 T, FALSE의 경우 F로 표현 가능)
- TRUE, FALSE 값은 숫자화 시킨 경우 각각 1과 0의 값을 가짐
- TRUE의 경우 FALSE가 아닌 것을 가정하므로, 큰 범위에서 보면 0이 아닌 모든 숫자를 의미
- NA / NULL
- NA의 경우 Not Available 상수
- 결측치(값이 빠져 있는 경우)를 의미
- NULL의 경우 NULL 객체 의미
- 프로그래밍 편의를 위한 미정의 값을 의미
- NA의 경우 Not Available 상수
연산자
편집1. 산술 연산자
편집연산자 | 설명 | 예 |
---|---|---|
+ | 덧셈 | a+b |
- | 뺄셈 | a-b |
* | 곱셈 | a*b |
/ | 나눗셈 | a/b |
^ | 지수 승 | a^2 |
%% | 나머지 | a%%b |
%/% | 몫 | a%/%b |
Ex)
> a<-9 # 변수 설정
> b<-3 # 변수 설정
> a+b # 덧셈
[1] 12
> a-b # 뺄셈
[1] 6
> a*b # 곱셈
[1] 27
> a/b # 나눗셈
[1] 3
> a^2 # 지수 승
[1] 81
> a%%b # 나머지
[1] 0
> a%/%b # 몫
[1] 3
2. 비교 연산자
편집연산자 | 설명 | 예 |
---|---|---|
== | 같은가 | a==b |
!= | 다른가 | a!=b |
> | 크다 | a>b |
>= | 크거나 같다 | a>=b |
< | 작다 | a<b |
<= | 작거나 같다 | a<=b |
Ex)
> x<-6 # 변수 설정
> y<-4 # 변수 설정
> x==y # 같은가
[1] FALSE
> x!=y # 다른가
[1] TRUE
> x>y # 크다
[1] TRUE
> x>=y # 크거나 같다
[1] TRUE
> x<y # 작다
[1] FALSE
> x<=y # 작거나 같다
[1] FALSE
- 비교 연산자의 경우 특정 조건에 대해 참 / 거짓으로 구분되며, 결과 값을 TRUE, FALSE로 반환
3. 논리 연산자
편집연산자 | 설명 | 예 |
---|---|---|
! | 아니다 | !a |
| | or | a|b |
|| | or(객체의 첫 번째 요소만 비교) | a||b |
& | and | a&b |
&& | and(객체의 첫 번째 요소만 비교) | a&&b |
Ex)
> a<-5 # 변수 설정
> b<-3 # 변수 설정
> !TRUE
[1] FALSE
> !FALSE
[1] TRUE
> # 3 < a < 7 구현
> a>3 & a<7
[1] TRUE
> # a<3, a>7 구현
> a<3 | a>7
[1] FALSE
> # | 와 ||, &와 && 차이
> x<-c(1,0,1); y<-c(0,1,1)
> x|y
[1] TRUE TRUE TRUE
> x&y
[1] FALSE FALSE TRUE
> x||y
[1] TRUE
> x&&y
[1] FALSE
Ex2) or 연산자, &연산자
TRUE | FALSE | |
---|---|---|
TRUE | TRUE | TRUE |
FALSE | TRUE | FALSE |
TRUE | FALSE | |
---|---|---|
TRUE | TRUE | FALSE |
FALSE | FLASE | FALSE |
4. 특수 연산자
편집- %any% 형태
- %in%
- 포함 여부를 물음
- 데이터 전처리 과정에서 자주 사용
- 연산자 생성
- %이름%<-function(x,y){연산 내용}의 형태
- %in%
- 행렬 곱 %*%
- 행렬 A 와 행렬 B의 곱
- A%*%B
- 행렬 A 와 행렬 B의 곱
Ex)
> x<-1:3; y<-2:5
> x %in% y
[1] FALSE TRUE TRUE
> "%s%"<-function(x,y) return(x^y)
> 3%s%2
[1] 9
> x<-matrix(1:4, ncol=2)
> y<-matrix(5:8, ncol=2)
> x%*%y
[,1] [,2]
[1,] 23 31
[2,] 34 46
벡터
편집벡터(vector)는 다른 프로그래밍 언어에서 흔하게 접하는 배열의 개념으로, 한 가지 스칼라 데이터 타입의 데이터를 저장할 수 있다.
1. 벡터 생성
편집- c()를 이용한 결합
- *rep() 반복 함수를 통해 생성
- *seq() ':'와 같이 범위 지정을 통해 생성
- 벡터 내의 스칼라는 모두 같은 데이터 타입을 가짐
Ex)
> vec <- c(1,2,3)
> vec2 <- rep(1,5)
> vec3 <- seq(2:4)
> vec4 <- 5:1
> vec; vec2; vec3; vec4
[1] 1 2 3
[1] 1 1 1 1 1
[1] 1 2 3
[1] 5 4 3 2 1
> rep(1:3, 2) # 1부터 3까지, 2번 반복
[1] 1 2 3 1 2 3
> rep(1:3,2,each=2) # 1부터 3까지를 각각 2번씩 2회 반복
[1] 1 1 2 2 3 3 1 1 2 2 3 3
> seq(1,5) # 1부터 5까지의 벡터 생성
[1] 1 2 3 4 5
> seq(1,5, by=2) # 1부터 5까지 2씩 건너띄어서 출력
[1] 1 3 5
> seq(1,3, length=5) # 1부터 3까지 5개로 출력
[1] 1.0 1.5 2.0 2.5 3.0
2. 벡터 연산
편집벡터의 모든 요소에 연산을 적용함을 기본으로 한다.
Ex)
> a<-1:3
> b<-2:4
> a+b
[1] 3 5 7
> a*b
[1] 2 6 12
> a%%b
[1] 1 2 3
> a<b
[1] TRUE TRUE TRUE
3. 벡터 recyling
편집두 벡터의 크기가 다를 경우 작은 벡터의 반복이 일어난다.
Ex)
> a<-1:3
> a+2
[1] 3 4 5
4. 벡터함수, non-벡터 함수
편집- 벡터함수 = 모든 요소에 적용되는 함수로, 출력 결과 개수가 input 벡터와 동일한 함수
함수 | 설명 | 예 |
---|---|---|
sqrt | 제곱근 | sqrt(x) |
abs | 절대값 | abs(x) |
round | 반올림 | round(x) |
log | 자연로그 | log(x) |
log10 | 상용로그 | log10(x) |
exp | 지수함수 | exp(x) |
trunc | 소수점 버림 | trunc(x) |
cumsum | 누적합 | cumsum(x) |
cumprod | 누적곱 | cumprod(x) |
cummax | 누적 최대값 | cummax(x) |
cummin | 누적 최소값 | cummin(x) |
이 외에도 다양한 함수 존재
Ex)
> x<-1:4
> sqrt(x) # 제곱근
[1] 1.000000 1.414214 1.732051 2.000000
> abs(x) # 절대값
[1] 1 2 3 4
> round(x) # 반올림
[1] 1 2 3 4
> log(x) # 자연로그
[1] 0.0000000 0.6931472 1.0986123 1.3862944
> log10(x) # 상용로그
[1] 0.0000000 0.3010300 0.4771213 0.6020600
> exp(x) # 지수함수
[1] 2.718282 7.389056 20.085537 54.598150
> trunc(x) # 소수점 버림
[1] 1 2 3 4
> cumsum(x) # 누적합
[1] 1 3 6 10
> cumprod(x) # 누적곱
[1] 1 2 6 24
> cummax(x) # 누적 최대값
[1] 1 2 3 4
> cummin(x) # 누적 최소값
[1] 1 1 1 1
2. non-벡터 함수
함수 | 설명 | 예 |
---|---|---|
mean | 평균 | mean(x) |
median | 중앙값 | median(x) |
range | 범위 출력 | range(x) |
sd | 표준편차 | sd(x) |
var | 분산 | var(x) |
sum | 합 | sum(x) |
min | 최소 | min(x) |
max | 최대 | max(x) |
IQR | 사분위편차 | IQR(x) |
diff | 차분 | diff(x) |
이 외에도 다양한 함수 존재
Ex)
x<-c(1,5,10)
> mean(x) # 평균
[1] 5.333333
> median(x) # 중앙값
[1] 5
> range(x) # 범위 출력
[1] 1 10
> sd(x) # 표준 편차
[1] 4.50925
> var(x) # 분산
[1] 20.33333
> sum(x) # 합
[1] 16
> min(x) # 최소
[1] 1
> max(x) # 최대
[1] 10
> IQR(x) # 사분위 편차
[1] 4.5
> diff(x) # 차분
[1] 4 5
3. 집합함수
함수 | 설명 | 예 |
---|---|---|
union | 합집합 | union(x,y) |
intersect | 교집합 | intersect(x,y) |
setdiff | 차집합 | setdiff(x,y) |
setequal | 동일한가? | setequal(x,y) |
is.element | 포함여부 | is.element(x,y) |
Ex)
> x<-c(1,2,3,4)
> y<-c(3,4,5,6)
> union(x,y) # 합집합
[1] 1 2 3 4 5 6
> intersect(x,y) # 교집합
[1] 3 4
> setdiff(x,y) # 차집합
[1] 1 2
> setequal(x,y) # 동일한가?
[1] FALSE
> is.element(x,y) #포함 여부
[1] FALSE FALSE TRUE TRUE
5. 벡터의 인덱싱, 필터링
편집- 인덱싱 = 벡터 요소의 위치에 해당하는 값을 출력
- [ ] 를 이용해서 인덱싱
- 필터링 = 원하는 조건의 값을 출력
Ex)
# 인덱싱
> x <- c(2,4,1,9,3)
> x[1] # 첫 번째 요소 출력
[1] 2
> x[4] # 네 번째 요소 출력
[1] 9
> x[2:4] # 두 번째 요소부터 네 번째 요소까지 출력
[1] 4 1 9
> x[5:1] # 다섯 번째 요소부터 첫 번째 요소까지 출력
[1] 3 9 1 4 2
# 필터링
> x <- c(1,5,6,8,2)
> x[c(TRUE,FALSE,FALSE,FALSE,TRUE)]
[1] 1 2
> x[x<3]
[1] 1 2
> x<3
[1] TRUE FALSE FALSE FALSE TRUE
#조건에 해당하는 값 변경
> x <- 1:4
> x[x>2] <- 0
> x
[1] 1 2 0 0
행렬과 배열
편집행렬(Matrix)은 수학 시간에 배운 행렬의 정의와 마찬가지로 행(Row)과 열(Column)의 수가 지정된 구조
행렬은 벡터와 마찬가지로 한 가지 유형의 스칼라만을 저장
1. 행렬과 배열의 생성
편집- 행렬 생성
matrix(값, nrow = 행의 개수,
ncol = 열의 개수,
byrow = FALSE(디폴트값),
# 값의 입력 방향, TRUE시 행 우선 기입
dimnames = NULL)
# 행과 열의 이름, 반드시 리스트로 기입
2. 배열 생성
array(값,
dim = c(행의 개수, 열의 개수, 차원(페이지)의 개수,
dimnames = NULL)
#행, 열, 페이지 이름, 반드시 리스트로 기입
Ex)
> matrix(1:4,2, byrow = T, dimnames = list(c("row1","row2"),c("col1","col2")))
col1 col2
row1 1 2
row2 3 4
> array(1:8,dim = c(2,2,2),
+ dimnames = list(c("행1","행2"), c("열1","열2"),c("페이지1","페이지2")))
, , 페이지1
열1 열2
행1 1 3
행2 2 4
, , 페이지2
열1 열2
행1 5 7
행2 6 8
2. 행렬과 배열의 인덱싱
편집- 행렬의 인덱싱
- 행렬[행의 index, 열의 index]
- 배열의 인덱싱
- 배열[행의 index, 열의 index, 페이지의 index]
해당 index자리를 공백으로 두면 해당 index의 전체를 의미한다.
예를 들어 matrix[x, ]와 같이 열의 index 자리를 비우게 되면 x행의 전체 열을 출력하라 의미
Ex)
> a <- matrix(1:9,3)
> a
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> a[1,]
[1] 1 4 7
> a[,1]
[1] 1 2 3
> a[c(1,3),]
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 3 6 9
> a[c(3,1,2),]
[,1] [,2] [,3]
[1,] 3 6 9
[2,] 1 4 7
[3,] 2 5 8
> b <- array(1:8,dim = c(2,2,2),
+ dimnames =list(c("행1","행2"), c("열1","열2"),c("페이지1","페이지2")))
> b
, , 페이지1
열1 열2
행1 1 3
행2 2 4
, , 페이지2
열1 열2
행1 5 7
행2 6 8
> b[1,1,2]
[1] 5
> b[,2,]
페이지1 페이지2
행1 3 7
행2 4 8
3. 행렬 간 연산 및 함수
편집함수 | 설명 | 예 |
---|---|---|
nrow | 행렬의 행(row)의 개수 | nrow(a) |
ncol | 행렬의 열(column)의 개수 | ncol(a) |
rownames | 행렬의 행 이름 설정 | rownames(a) |
colnames | 행렬의 열 이름 설정 | colnames(a) |
%*% | 행렬의 곱 | a%*%b |
rowSums | 행렬의 행 합계 | rowSums(a) |
colSums | 행렬의 열 합계 | colSums(a) |
diag | 행렬의 대각원소 | diag(a) |
t | 전치행렬 | t(a) |
Ex)
> a<-matrix(1:9, ncol=3, nrow=3) # 3X3 matrix 생성
> a
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> rownames(a)<-c("A","B","C") # 행 이름 설정
> colnames(a)<-c("AA","BB","CC") # 열 이름 설정
> a
AA BB CC
A 1 4 7
B 2 5 8
C 3 6 9
> rowSums(a) # 행렬의 행 합계
A B C
12 15 18
> colSums(a) # 행렬의 열 합계
AA BB CC
6 15 24
> diag(a) # 행렬의 대각 원소
[1] 1 5 9
> t(a) # a의 전치행렬
A B C
AA 1 2 3
BB 4 5 6
CC 7 8 9
리스트
편집리스트(list)는 배열과 비교할 때 데이터를 중간 중간에 삽입하는 데 유리한 구조로 설명한다. R에서 리스트는 데이터를 접근한다는 관점에서 다른 언어의 해시 테이블(hash table) 또는 딕셔너리(dictionary)로 종종 설명된다. 리스트는 벡터와 다르게 값이 서로 다른 데이터 타입을 담을 수 있다.
1. 리스트와 데이터 프레임의 자료구조
편집- 리스트의 경우 서로 다른 데이터 타입의
2. 리스트의 생성
편집리스트는 list()함수를 이용하여 생성
Ex)
> x <- list("kookmin","dna",100,TRUE);x # x 리스트 생성
[[1]]
[1] "kookmin"
[[2]]
[1] "dna"
[[3]]
[1] 100
[[4]]
[1] TRUE
> y <- list(univ = "kookmin", acad = "dna", score = 100, growth = TRUE);y # y 리스트 생성(이름 지정)
$univ
[1] "kookmin"
$acad
[1] "dna"
$score
[1] 100
$growth
[1] TRUE
3. 리스트의 인덱싱
편집리스트의 인덱싱은 다른 데이터 타입과 마찬가지로 []를 이용하여 인덱싱
[[]] 를 이용하여 키를 인덱싱하고, 이후에 []를 이용하여 값을 인덱싱
Ex)
> z <- list(c("a","b","c"),TRUE,c(1,2,3));z # z 리스트 생성
[[1]]
[1] "a" "b" "c"
[[2]]
[1] TRUE
[[3]]
[1] 1 2 3
> z[[3]][2] # z의 3번째 키에 2번째 값
[1] 2
> z[[1]][3] # z의 1번째 키에 3번째 값
[1] "c"
데이터 프레임
편집데이터 프레임(Data Frame)은 처리할 데이터를 엑셀의 스프레드시트와 같이 표 형태로 정리한 모습이다.
데이터 프레임은 R에서 가장 많이 쓰이는 데이터 타입이다.
최근에는 데이터 프레임과 유사한 형태이지만, 성능에서 우수한 데이터 테이블(Data table)이 더욱 각광 받고 있다.
1. 데이터 프레임의 특징
편집- 데이터 프레임의 경우 행과 열로 이루어진 데이터 타입이기 때문에 행의 개수가 일치 하지 않은 데이터 셋의 경우 생성되지 않는다.
2. 데이터 프레임의 생성
편집각각의 벡터를 생성한 후 결합 가능
Ex)
> id<-c(20130001, 20130002, 20130003, 20130004)
> name<-c("김길동", "이길동","홍길동" ,"양길동")
> study<-c("월","화","수","목")
> class<-data.frame(id, name, study, stringsAsFactors = FALSE)
> class
id name study
1 20130001 김길동 월
2 20130002 이길동 화
3 20130003 홍길동 수
4 20130004 양길동 목
3. 데이터 프레임의 접근
편집데이터 프레임의 각각의 열에 접근 할 때는 데이터프레임$열이름을 이용하여 접근한다.
Ex)
> class$id
[1] 20130001 20130002 20130003 20130004
> class$name
[1] "김길동" "이길동" "홍길동" "양길동"
> class$study
[1] "월" "화" "수" "목"
4. 데이터 프레임의 인덱싱
편집데이터 프레임의 인덱싱은 행렬의 인덱싱과 마찬가지로 []를 이용하여 인덱싱한다.
Ex)
> class[1,]
id name study
1 20130001 김길동 월
> class[,1]
[1] 20130001 20130002 20130003 20130004
> class[1:3,]
id name study
1 20130001 김길동 월
2 20130002 이길동 화
3 20130003 홍길동 수
5. 데이터 프레임의 수정
편집데이터 프레임의 수정은 인덱싱 후에 값을 설정함으로써 수정이 가능하다.
Ex)
> class$id[1]<-20139999
> class
id name study
1 20139999 김길동 월
2 20130002 이길동 화
3 20130003 홍길동 수
4 20130004 양길동 목
> class$name[1]<-"전민"
> class
id name study
1 20139999 전민 월
2 20130002 이길동 화
3 20130003 홍길동 수
4 20130004 양길동 목
6. 파일 입출력
편집대부분의 경우 데이터 프레임은 R 내에서 만들어서 사용하기 보다는 기존 파일을 읽어오는 경우가 일반적이다.
이를 위해서는 Working Directory를 설정하여 내가 불러오고자 하는 파일이 있는 곳을 설정한다.
> setwd("C:/Users/MJ/Documents") # working directory 설정
> getwd() # directory 확인
[1] "C:/Users/MJ/Documents"
# 파일 입력 함수
read.csv("파일이름.csv", header=TRUE, sep=".",stringAsFactors=FALSE) # csv 파일 입력
read.table("파일이름.형식", header= TRUE, sep=", or \t", stringAsFactors=FALSE) # table 파일 입력
read.delim("파일이름.형식", header= TRUE, sep="\t", stringAsFactors=FALSE) # csv, table 파일 구분없이 입력 가능
# 파일 출력(csv 파일로)
write.csv(변수, "파일이름.csv ", row.names=FALSE) # csv로 파일 저장