본문 바로가기

■ 프로그래밍/R

[R 기초] 데이터 유형 - Factor, Matrix

[ R 데이터 유형 : Factor, Matrix ]


# 주석
## 결과값

Data Type

  1. Vector ***
    2. Factor *
  2. Matrix
  3. Array
  4. Data Frame ***
  5. List *
    (* 중요도)


2. Factor

[특징]
- 하나의 열로 구성
- 1차원 구조 (=vector)
- 집단으로 인식

2.1 Factor 만들기

factor(vector, labels = , levels = , ordered = )]

address <- c("서울", "서울", "서울", "대전", "서울", "서울", "서울", "경기", "서울", "서울")
address.factor1 <- factor(address)
address.factor1
##  [1] 서울 서울 서울 대전 서울 서울 서울 경기 서울 서울
## Levels: 경기 대전 서울

levels는 vector안의 유일한 변수를 뜻한다.

address.factor2 <- factor(address, 
                          labels = c("경기도", "대전광역시", "서울특별시"))
address.factor2
##  [1] 서울특별시 서울특별시 서울특별시 대전광역시 서울특별시 서울특별시
##  [7] 서울특별시 경기도     서울특별시 서울특별시
## Levels: 경기도 대전광역시 서울특별시

labels를 표시하면, vector와 levels 모두 labels를 따른다.

address.factor3 <- factor(address,
                          levels = c("서울", "경기", "대전"))
address.factor3
##  [1] 서울 서울 서울 대전 서울 서울 서울 경기 서울 서울
## Levels: 서울 경기 대전

levels에서 나타나는 순서를 정한다. 이때 vector값에 없는 이름으로 levels를 입력하면 NA값으로 뜨니 주의해야 한다.

address.factor4 <- factor(address,
                          levels = c("서울", "경기", "대전"),
                          labels = c("서울특별시", "경기도", "대전광역시"))
address.factor4
##  [1] 서울특별시 서울특별시 서울특별시 대전광역시 서울특별시 서울특별시
##  [7] 서울특별시 경기도     서울특별시 서울특별시
## Levels: 서울특별시 경기도 대전광역시

levels와 labels의 작성 순서가 다를 경우, levels는 labels 순서를 따른다.

address.factor5 <- factor(address,
                          levels = c("서울", "경기", "대전"),
                          labels = c("서울특별시", "경기도", "대전광역시"),
                          ordered = TRUE)
address.factor5
##  [1] 서울특별시 서울특별시 서울특별시 대전광역시 서울특별시 서울특별시
##  [7] 서울특별시 경기도     서울특별시 서울특별시
## Levels: 서울특별시 < 경기도 < 대전광역시

levels간의 우선순위를 설정하고 싶을 때는 ordered를 사용한다.

2.2 Factor의 속성

levels(factor)
- 집단의 개수와 이름을 볼 수 있음

levels(address.factor5)
## [1] "서울특별시" "경기도"     "대전광역시"



Data Type

  1. Vector ***
  2. Factor *
    3. Matrix
  3. Array
  4. Data Frame ***
  5. List *
    (* 중요도)


3. Matrix

[특징]
- 행(row)과 열(column)으로 구성
- 2차원 구조
- 하나의 데이터 유형만 가짐

3.1 Matrix 만들기

v1 <- 1:3
v2 <- 4:6
v3 <- 1:10
  1. rbind(vector, vector, …)
    bind vectors based on row 행을 기준으로 묶음
rbind(v1, v2)     # 2 by 3 matrix
##    [,1] [,2] [,3]
## v1    1    2    3
## v2    4    5    6
rbind(v1, v2, v3) # 비어있는 자리는 recycling으로 채워짐
## Warning in rbind(v1, v2, v3): number of columns of result is not a multiple
## of vector length (arg 1)
##    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## v1    1    2    3    1    2    3    1    2    3     1
## v2    4    5    6    4    5    6    4    5    6     4
## v3    1    2    3    4    5    6    7    8    9    10
  1. cbind(vector, vector, …)
    bind vectors based on colunm 열을 기준으로 묶음
cbind(v1, v2)     # 3 by 2 matrix
##      v1 v2
## [1,]  1  4
## [2,]  2  5
## [3,]  3  6
cbind(v1, v2, v3)
## Warning in cbind(v1, v2, v3): number of rows of result is not a multiple of
## vector length (arg 1)
##       v1 v2 v3
##  [1,]  1  4  1
##  [2,]  2  5  2
##  [3,]  3  6  3
##  [4,]  1  4  4
##  [5,]  2  5  5
##  [6,]  3  6  6
##  [7,]  1  4  7
##  [8,]  2  5  8
##  [9,]  3  6  9
## [10,]  1  4 10
  1. matrix(vector, nrow = , ncol = , byrow = TRUE)
matrix(1:4, nrow = 2, ncol = 2)               # byrow를 지정하지 않으면 열이 우선
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
matrix(1:4, nrow = 2, ncol = 2, byrow = TRUE) # byrow = TRUE '행'부터
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4

vector와 행렬의 길이가 맞지 않다면, 경고가 뜸과 동시에 recycling 규칙 시행.

matrix(1:4, nrow = 3, ncol = 3, byrow = TRUE)
## Warning in matrix(1:4, nrow = 3, ncol = 3, byrow = TRUE): 데이터의 길이[4]
## 가 행의 개수[3]의 배수가 되지 않습니다
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    1    2
## [3,]    3    4    1


3.2 행렬의 덧셈과 뺄셈

조건: 두 행렬 간의 행의 개수와 열의 개수가 모두 같아야 함.

A <- matrix(1:4, nrow = 2, ncol = 2) # 보통 행렬은 대문자
B <- matrix(5:8, nrow = 2, ncol = 2)
A + B
##      [,1] [,2]
## [1,]    6   10
## [2,]    8   12
A - B
##      [,1] [,2]
## [1,]   -4   -4
## [2,]   -4   -4


3.3 Matrix의 속성(attribute)

  1. 행의 개수: nrow(matrix)
nrow(A) ## 2
  1. 열의 개수: ncol(matrix)
ncol(A) ## 2
  1. 행의 이름: rownames(matrix)
rownames(A) # 지정되어 있지 않으면 NULL
## NULL
rownames(A) <- c("R1", "R2") # 행이름 지정
A
##    [,1] [,2]
## R1    1    3
## R2    2    4
  1. 열의 이름: colnames(matrix)
colnames(A) <- c("C1", "C2")
A
##    C1 C2
## R1  1  3
## R2  2  4
  1. 차원(dimension): dim(matrix) 행의 개수와 열의 개수를 동시에 알려줌
dim(A)    #(결과 = 행 열, numeric vector)
         ## 2 2
dim(A)[1] # 행의 개수 : ## 2
dim(A)[2] # 열의 개수 : ## 2
  1. 차원의 이름: dimnames(matrix) 행의 이름과 열의 이름을 동시에 알려줌
dimnames(A) # 결과는 list 형태 (ex. [[1]])
## [[1]]
## [1] "R1" "R2"
## 
## [[2]]
## [1] "C1" "C2"
dimnames(A)[[1]][1]
## [1] "R1"


3.3 Matrix의 Slice

matrix[rowIndex, colIndex]
(1) 열 matrix[ ,colIndex]

B <- matrix(1:6, nrow = 2, ncol = 3)
B[ ,1]               # 최종적인 결과는 vector
## [1] 1 2
B[ ,1, drop = FALSE] # drop = FALSE 형태를 그대로 행렬로 유지
##      [,1]
## [1,]    1
## [2,]    2
B[ ,c(1,3)]          # 행이나 열이 하나일 때만 vector, 두 개이상이면 matrix그대로 유지
##      [,1] [,2]
## [1,]    1    5
## [2,]    2    6
B[ ,2:3]
##      [,1] [,2]
## [1,]    3    5
## [2,]    4    6
  1. 행 matrix[rowIndex, ]
B[1, ]               # 최종적인 결과는 vector
## [1] 1 3 5
B[1, , drop = FALSE] # 최종적인 결과는 matrix
##      [,1] [,2] [,3]
## [1,]    1    3    5
B[1:2, ]
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
  1. 행과 열
    matrix[rowIndex, colIndex]
B[2,2]      # 최종적인 결과는 vector
## [1] 4
B[2, 2:3]
## [1] 4 6
B[1:2, 2:3] # 최종적인 결과는 matrix
##      [,1] [,2]
## [1,]    3    5
## [2,]    4    6

3.4 Matrix의 연산

  1. 덧셈과 뺄셈
  • 조건1 : 두 행렬의 shape가 같아야 함
  • 조건2 : 두 행렬의 행의 개수와 열의 개수가 같아야 함
A <- matrix(1:4, nrow = 2, ncol = 2)
B <- matrix(5:8, nrow = 2, ncol = 2)
A + B
A - B
A * B # 같은 위치끼리 곱하는 것. 행렬의 곱셈이 아님
  1. 곱셈
  • 조건: 첫 번째 행렬의 열의 개수 = 두 번째 행렬의 행의 개수
  • 결과: 첫 번째 행렬의 행의 개수 * 두 번째 행렬의 열의 개수
A %*% B
##      [,1] [,2]
## [1,]   23   31
## [2,]   34   46
  1. 역행렬(Inverse Matrix)
    solve(matrix)
  • 조건1 : 행의 개수와 열의 개수가 같아야 함 = 정방행렬(Square Matrix)
  • 조건2 : 행렬식(determinant)이 0이 아니어야 함
solve(A)
##      [,1] [,2]
## [1,]   -2  1.5
## [2,]    1 -0.5
det(A)          # 행렬식(Determinant)
## [1] -2
A %*% solve(A)  # 단위행렬(Identity Matrix)
##      [,1] [,2]
## [1,]    1    0
## [2,]    0    1
solve(A) %*% A  # 단위행렬
##      [,1] [,2]
## [1,]    1    0
## [2,]    0    1

역행렬을 알면 방정식을 빨리 풀 수 있음

A <- matrix(c(1,2,-1,1), nrow = 2, ncol = 2)
B <- matrix(c(3,0), nrow = 2, ncol = 1)
A;B
solve(A) %*% B     # A의 역행렬 * B로 미지수 구하기
  1. 전치행렬(Transpose Matrix)
    t(matrix)
  • 행과 열을 바꿈
t(A)
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4