[ R 데이터 유형 : Factor, Matrix ]
# 주석
## 결과값
Data Type
- Vector ***
2. Factor * - Matrix
- Array
- Data Frame ***
- 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
- Vector ***
- Factor *
3. Matrix - Array
- Data Frame ***
- List *
(* 중요도)
3. Matrix
[특징]
- 행(row)과 열(column)으로 구성
- 2차원 구조
- 하나의 데이터 유형만 가짐
3.1 Matrix 만들기
v1 <- 1:3
v2 <- 4:6
v3 <- 1:10
- 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
- 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
- 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)
- 행의 개수: nrow(matrix)
nrow(A) ## 2
- 열의 개수: ncol(matrix)
ncol(A) ## 2
- 행의 이름: rownames(matrix)
rownames(A) # 지정되어 있지 않으면 NULL
## NULL
rownames(A) <- c("R1", "R2") # 행이름 지정
A
## [,1] [,2]
## R1 1 3
## R2 2 4
- 열의 이름: colnames(matrix)
colnames(A) <- c("C1", "C2")
A
## C1 C2
## R1 1 3
## R2 2 4
- 차원(dimension): dim(matrix) 행의 개수와 열의 개수를 동시에 알려줌
dim(A) #(결과 = 행 열, numeric vector)
## 2 2
dim(A)[1] # 행의 개수 : ## 2
dim(A)[2] # 열의 개수 : ## 2
- 차원의 이름: 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
- 행 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
- 행과 열
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 : 두 행렬의 shape가 같아야 함
- 조건2 : 두 행렬의 행의 개수와 열의 개수가 같아야 함
A <- matrix(1:4, nrow = 2, ncol = 2)
B <- matrix(5:8, nrow = 2, ncol = 2)
A + B
A - B
A * B # 같은 위치끼리 곱하는 것. 행렬의 곱셈이 아님
- 곱셈
- 조건: 첫 번째 행렬의 열의 개수 = 두 번째 행렬의 행의 개수
- 결과: 첫 번째 행렬의 행의 개수 * 두 번째 행렬의 열의 개수
A %*% B
## [,1] [,2]
## [1,] 23 31
## [2,] 34 46
- 역행렬(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로 미지수 구하기
- 전치행렬(Transpose Matrix)
t(matrix)
- 행과 열을 바꿈
t(A)
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
'■ 프로그래밍 > R' 카테고리의 다른 글
[R 기초] 외부 데이터(txt, csv, excel) 불러오기 (0) | 2018.08.21 |
---|---|
[R 기초] 데이터 유형 - Array, Data.Frame, List (0) | 2018.08.19 |
[R 기초] 데이터 유형 - Vector (0) | 2018.08.17 |
[R 기초] 연산자, 데이터 유형, is, as (0) | 2018.08.11 |
[R, R studio] 소개 (0) | 2018.08.11 |