본문으로 이동

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. 변수 할당 및 출력

[편집]

- 변수 할당 방법

  1. ' <- '
  2. ' = '

할당 연산자 중 '='는 명령의 최상위 수준에서만 사용할 수 있는 반면 '<-'는 어느 곳에서나 사용할 수 있다.

만약 '='를 사용한다면 경우에 따라 표현력에 한계가 있을 수 있기 때문에 변수에 값을 할당 할 때 '='보다는 '<-'를 사용하는 것이 좋다.

Ex)

> x<-3 # x라는 변수 명에 3이라는 값이 할당 됨.
> z=5 # z라는 변수 명에 5라는 값이 할당 됨.
> jeon<-"MinJae" # jeon이라는 변수 명에 MinJae 라는 문자가 할당 됨.

- 변수 출력 방법

  1. 변수명 직접 호출
  2. *print()
  3. *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. 변수 명 규칙

[편집]
  1. 변수 명은 특수문자 중 '.'(마침표), '_'(언더바), 영어, 숫자만 사용 가능
  2. 변수 명은 숫자나 '_'(언더바)로 시작 불가
  3. 변수명이 '.'(마침표)로 시작할 경우 바로 뒤엔 영어가 와야 함

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이 있다.

  1. Numeric
    1. 숫자형 타입
    2. numeric, integer 두 개의 타입이 존재(numeric의 경우 실수, integer의 경우 정수로 표현)
    3. 특별히 지정하지 않는 경우 변수는 numeric으로 설정
  2. Character
    1. 문자형 타입
    2. Character, factor 두 개의 타입이 존재(character의 경우 문자, factor의 경우 level이 존재하는 문자로 표현)
    3. ""(큰따옴표) 혹은 ''(작은따옴표)를 사용하면 문자형 타입으로 취급
    4. factor의 경우 범주형 데이터를 표현하기 위한 데이터 타입
  3. Logical
    1. 논리형 타입
    2. TRUE, FALSE 두 가지 타입이 존재(TRUE의 경우 T, FALSE의 경우 F로 표현 가능)
    3. TRUE, FALSE 값은 숫자화 시킨 경우 각각 1과 0의 값을 가짐
      1. TRUE의 경우 FALSE가 아닌 것을 가정하므로, 큰 범위에서 보면 0이 아닌 모든 숫자를 의미
  4. NA / NULL
    1. NA의 경우 Not Available 상수
      1. 결측치(값이 빠져 있는 경우)를 의미
    2. NULL의 경우 NULL 객체 의미
      1. 프로그래밍 편의를 위한 미정의 값을 의미

연산자

[편집]

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 연산자, &연산자

or 연산자
TRUE FALSE
TRUE TRUE TRUE
FALSE TRUE FALSE
& 연산자
TRUE FALSE
TRUE TRUE FALSE
FALSE FLASE FALSE

4. 특수 연산자

[편집]
  1. %any% 형태
    1. %in%
      1. 포함 여부를 물음
      2. 데이터 전처리 과정에서 자주 사용
    2. 연산자 생성
      1. %이름%<-function(x,y){연산 내용}의 형태
  2. 행렬 곱 %*%
    1. 행렬 A 와 행렬 B의 곱
      1. 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. 벡터 생성

[편집]
  1. c()를 이용한 결합
  2. *rep() 반복 함수를 통해 생성
  3. *seq() ':'와 같이 범위 지정을 통해 생성
  4. 벡터 내의 스칼라는 모두 같은 데이터 타입을 가짐

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-벡터 함수

[편집]
  1. 벡터함수 = 모든 요소에 적용되는 함수로, 출력 결과 개수가 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. 벡터의 인덱싱, 필터링

[편집]
  1. 인덱싱 = 벡터 요소의 위치에 해당하는 값을 출력
    1. [ ] 를 이용해서 인덱싱
  2. 필터링 = 원하는 조건의 값을 출력

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. 행렬과 배열의 생성

[편집]
  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 21   1   32   2   4

, , 페이지2

    1 21   5   72   6   8

2. 행렬과 배열의 인덱싱

[편집]
  1. 행렬의 인덱싱
    1. 행렬[행의 index, 열의 index]
  2. 배열의 인덱싱
    1. 배열[행의 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 21   1   32   2   4

, , 페이지2

    1 21   5   72   6   8

> b[1,1,2]
[1] 5

> b[,2,]
    페이지1 페이지21       3       72       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. 리스트와 데이터 프레임의 자료구조

[편집]
  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. 데이터 프레임의 특징

[편집]
  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로 파일 저장