6 분 소요

image


R 기본 객체와 자료 형태 (1)


5가지 기본 객체

  • Character (문자형)
  • Numeric (real numbers) (숫자형, 실수형)
  • Integer (정수형)
  • Complex (복소수형)
  • Logical (True/False) (논리형)


R에서의 자료 형태

  • Vector (벡터)
  • Matrix (메트릭스 = 행렬)
  • List (리스트)
  • Factor (범주형)
  • Data Frame (데이터 프레임)


벡터


벡터 (Vector)

  • 같은 종류의 객체들만을 포함하는 자료 형태
  • 1차원 배열

image

  • 벡터 생성하기
x <- c(0.5, 0.6)        ## numeric
x <- c(TRUE, FALSE)     ## logical
x <- c(T, F)            ## logical
x <- c("a", "b", "c")   ## character
x <- 9:29               ## integer
x <- c(1+0i, 2+4i)      ## complex


실습 - 벡터 (Vector)

  • 벡터 생성하기
x <- c(1, 2.5, 3.2)                     # double
y <- c(1L, 2L, 3L)                      # integer
z <- c("KTX", "Saemaul", "Mugunghwa")   # string
v <- c(TRUE, FALSE, FALSE, TRUE)        # logical
  • 벡터에서 인덱싱
    x[3]                # x 의 세 번째 성분
## [1] 3.2

    x[c(1,3)]           # x 의 첫 번째, 세 번째 성분을 추출한 부분 벡터
## [1] 1.0 3.2
  • 벡터에 이름 부여하기
    fruit <- c(5, 3, 2)
    names(fruit) <- c("apple", "orange", "peach")
    fruit
##  apple orange  peach
##      5      3      2

    fruit[c("apple", "peach")]
##  apple peach
##      5     2

    fruit <- setNames(c(5, 3, 2), c("apple", "orange", "peach"))
  • 벡터의 길이 구하기
    length(x)           # length of x
## [1] 3
  • 기존 벡터를 사용하여 새로운 벡터 생성하기
    a <- c(1, 2, 3)
    b <- c(5, 6)
    x <- c(a, 4, b)     # x <- c(1,2,3,4,5,6)
  • 인덱스 범위가 넘는 자리에 값을 할당하면?
    a[7] <- 2
    a
## [1]  1  2  3 NA NA NA  2
  • 기존 벡터에 객체 삽입하기
    append(x, 99, after=3)     # x 의 세 번째 성분 다음에 99 삽입
## [1]  1  2  3 99  4  5  6

    append(x, -99, after=0)    # x 의 맨 앞에 -99 삽입
## [1]  -99   1   2   3   4   5   6
  • seq(), rep() 를 사용해서 벡터 생성하기
    x <- seq(from=0, to=1, by=0.1)
    x
## [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

    y <- seq(from=0, to=1, length=11)
    y
## [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

    rep(1, 10)
## [1] 1 1 1 1 1 1 1 1 1 1 
  • 벡터간 산술 연산하기
    x <- 1:3; y <- c(2,2,2)
    x+y
## [1] 3 4 5

    x-y
## [1] -1  0  1

    x*y
## [1] 2 4 6

    x/y
## [1] 0.5 1.0 1.5

    x^y
## [1] 1 4 9


암시적 형변환(Implicit Coercion)

  • When different objects are mixed in a vector, implicit coercion occurs so that every element in the vector is of the same class.
y <- c(1.7, "a")    ## character  [1] "1.7" "a"
y <- c(TRUE, 2)     ## numeric    [1] 1 2
y <- c("a", TRUE)   ## character  [1] "a" "TRUE"

📌 Priority : Logical < Numeric < Character


명시적 형변환(Explicit Coercion)

x <- 0:6
class(x)
## [1] "integer"

as.numeric(x)
## [1] 0 1 2 3 4 5 6

as.logical(x)
## [1] FALSE   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE

as.character(x)
## [1] "0" "1" "2" "3" "4" "5" "6"

📌 R can’t figure out how to coerce an object → this ccan result in NAs being produced.

x <- c("a", "b", "c")
as.numeric(x)
## [1] NA NA NA
## Warning message:
## NAs introducecd by coercion

as.logical(x)
## NA NA NA

as.complex(x)
## [1] NA NA NA
## Warning message:
## NAs introducecd by coercion


실습 - 통계함수 사용하기

  • 정규분포를 따르는 난수 발생시키기
    x <- rnorm(10)
    x
## [1] -0.34246270  0.58343596  1.54340829 -1.68275292 -0.07331261
## [6]  1.02802626 -0.71574842 -0.62199705  0.03085437 -1.39492435

    y <- 1:10
    y
## [1]  1  2  3  4  5  6  7  8  9 10

    z <- -5:4
    z
## [1] -5 -4 -3 -2 -1  0  1  2  3  4
max(x)        # 최대값
min(x)        # 최소값
sum(x)        # 모든 성분의 합
prod(x)       # 모든 성분의 곱
mean(x)       # 평균
median(x)     # 중앙값
range(x)      # 최대값과 최소값의 차이
quantile(x, probs=c(0.2, 0.7))    # 분위수
var(x)        # 분산
sd(x)         # 표준편차
cov(x, y)     # 공분산
cor(x, y)     # 상관계수
cumsum(x)     # 누적합
cumprod(x)    # 누적곱
cummax(x)     # 누적최대값
cummin(x)     # 누적최소값
pmax(x, y, z) # 성분별 최대값
pmin(x, y, z) # 성분별 최소값


메트릭스 (Matrix)

  • 행렬의 수학적 의미
    • 수나 기호, 수식 등을 네모꼴로 배열한 것
    • 행렬 안에 배열된 구성원들을 성분(entry) 또는 항, 원소(element)라고 함
    • 행렬의 가로줄을 행(row), 세로줄을 열(column)
    • m개의 행, n개의 열로 이루어진 행렬 → m x n 행렬 (m by n matrix)

image


메트릭스 (Matrix) 생성하기

  • 방법 1: matrix 함수를 사용
    m <- matrix(nrow = 2, ncol = 3)
    m
##      [,1] [,2] [,3]
## [1,]   NA   NA   NA
## [2,]   NA   NA   NA

📌 “column-wise” 형태로 값을 구성함 (왼쪽 상단부터 값이 채워짐)

  • 방법 2: dim 함수를 사용
    m <- 1:10
    m
    
    dim(m) <- c(2,5)
    m
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8   10
  • 방법 3: cbind 혹은 rbind 함수를 사용
    x <- 1:3
    y <- 10:12
    cbind(x, y)
##       x  y
## [1,]  1 10
## [2,]  2 11
## [3,]  3 12

    rbind(x, y)
  [,1] [,2] [,3]
x    1    2    3
y   10   11   12


실습 - 메트릭스

  • 다양한 방법으로 메트릭스 생성하기
    z <- matrix(1:20, 4, 5)
    z
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    5    9   13   17
## [2,]    2    6   10   14   18
## [1,]    3    7   11   15   19
## [2,]    4    8   12   16   20

    z <- matrix(2, 4, 5)
    z
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    2    2    2    2    2
## [2,]    2    2    2    2    2
## [1,]    2    2    2    2    2
## [2,]    2    2    2    2    2

    z <- matrix(c(1, 2, 3,
                  4, 5, 6),
                nrow = 2, ncol = 3, byrow=T)
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
  • 기본 벡터 혹은 행렬을 결합해서 새로운 행렬을 생성하기
    x <- 1:4
    y <- 5:8

    cbind(x, y)
##      x y
## [1,] 1 5
## [2,] 2 6
## [3,] 3 7
## [4,] 4 8

    rbind(x, y)
##   [,1] [,2] [,3] [,4]
## x    1    2    3    4
## y    5    6    7    8
  • 기본 벡터 혹은 행렬을 결합해서 새로운 행렬을 생성하기
    B <- matrix(0, 4, 5)
    cbind(B, 1:4)
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    0    0    0    0    0    1
## [2,]    0    0    0    0    0    2
## [1,]    0    0    0    0    0    3
## [2,]    0    0    0    0    0    4

    A <- matrix(1:20, 4, 5)
    B <- matrix(1:20, 4, 5)
    C <- bind(A, B)
    C
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,]    1    5    9   13   17    1    5    9   13    17
## [2,]    2    6   10   14   18    2    6   10   14    18
## [1,]    3    7   11   15   19    3    7   11   15    19
## [2,]    4    8   12   16   20    4    8   12   16    20
  • 행렬간 산술연산
    A+B
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    2   10   18   26   34
## [2,]    4   12   20   28   36
## [1,]    6   14   22   30   38
## [2,]    8   16   24   32   40

    A-B
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    0    0    0    0    0
## [2,]    0    0    0    0    0
## [1,]    0    0    0    0    0
## [2,]    0    0    0    0    0

    A*B
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1   25   81  169  289
## [2,]    4   36  100  196  324
## [1,]    9   49  121  225  361
## [2,]   16   64  144  256  400

    A/B
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    1    1    1    1
## [2,]    1    1    1    1    1
## [3,]    1    1    1    1    1
## [4,]    1    1    1    1    1
  • 행렬의 각 행과 열에 이름을 부여하기
      z <- matrix(1:20, 4, 5)
      z
    ##      [,1] [,2] [,3] [,4] [,5]
    ## [1,]    1    5    9   13   17
    ## [2,]    2    6   10   14   18
    ## [3,]    3    7   11   15   19
    ## [4,]    4    8   12   16   20
    
      colnames(z) <- c("alpha", "beta", "gamma", "delta", "eps")
      rownames(z) <- c("a", "b", "c", "d")
      z
    ##   alpha beta gamma delta eps
    ## a     1    5     9    13  17
    ## b     2    6    10    14  18
    ## c     3    7    11    15  19
    ## d     4    8    12    16  20
    

📌 행렬의 인덱싱

image

댓글남기기