[R] 행렬(matrix) 다루기
- R
- 2022. 5. 5.
2차원 벡터인 행렬의 에 대해 알아보겠습니다.
R에서 행렬은 벡터와 마찬가지로 한 가지 유형의 값으로만 저장할 수 있습니다. 따라서, 1열은 숫자, 2열은 문자같이 두 가지 유형의 값으로는 행렬을 만들 수 없습니다.
행렬 생성하기
파라미터는 다음과 같습니다.
matrix(data, nrow,ncol, byrow,dimnames)
- data : 행렬에 저장할 데이터
- nrow : 행의 개수, 디폴트 1
- ncol : 열의 개수, 디폴트 1
- byrow : 행렬의 데이터 입력순서(디폴트 False),
- True : 행을 기준으로 입력
- False : 열을 기준으로 입력
- dimnames : 행과 열의 이름
행렬을 작성할 때 조심해야할 것은 짝이 안 맞을 때입니다.
파이썬 같은 경우 짝이 안 맞으면 오류가 나고 마는데
R은 warning이 나오긴 숫자가 반복적으로 지정되서 나옵니다.
matrix(c(1:12),nrow=5)
12개의 숫자를 5개의 row로 지정하게 되면 3 자리가 남습니다.
이를 12숫자의 처음으로 돌아가 1,2,3으로 매꾸게 됩니다.
별게 아닌 것 같지만 계산이 이상해지는 가장 큰 원인이 될 수 있어서 주의가 필요합니다.
행, 열 지정
행지정은 행의 갯수를 먼저 지정한 후 행에 맞춰서 배열을 하고 열지정은 열의 갯수를 지정한 후 열에 맞춰서 배열을 합니다.
# 행(row) 지정
>matrix(c(1:12),nrow=4)
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
#열(col) 지정
>matrix(c(1:12),ncol=4)
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
배열 기준 지정(byrow)
byrow를 이용하면 배열 기준을 정할 수 있습니다. 디폴트는 False로 열을 기준으로 입력되게 되어있습니다. 따라서 열(col)부터 채우면서 배열을 합니다.
# 행(row) 기준으로 입력
> matrix(c(1:12),nrow=3,byrow=T)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
# 열(col) 기준으로 입력
> matrix(c(1:12,nrow=3,byrow=F))
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
행,열 이름 부여(dimnames)
위에서 만든 행렬을 보면 [,1], [1,] 같이 인덱스로 되어있는데 dimnames를 이용해 여기에 이름을 넣을 수 있습니다.
dimnames에는 행(row), 열(col) 순서로 리스트로 작성합니다.
> matrix(c(1:12),nrow=3,dimnames=list(c('r1','r2','r3'),c('c1','c2','c3','c4')))
c1 c2 c3 c4
r1 1 4 7 10
r2 2 5 8 11
r3 3 6 9 12
인덱스
인덱스는 matrix[행,열] 입니다.
행만 불러오려면 matrix[행,], 열만 불러오려면 matrix[,열]로 불러올 수 있습니다.
인덱싱 할 때 벡터도 넣을 수 있는데 이 또한 행 또는 열을 가져올 수 있습니다.
> matrix1 = matrix(c(1:12),nrow=4)
> matrix1
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
> matrix1[1,] #1행 가져오기
[1] 1 5 9
> matrix1[,2] #2열 가져오기
[1] 5 6 7 8
> matrix[1,2] #1행 2열 값 가져오기
[1] 5
> matrix1[c(2,3),2] #2열의 2,3행만 가져오기
[1] 6 7
> matrix1[c(T,F,F,T)] #각 열의 1,4번째 값 가져오기
[1] 1 4 5 8 9 12
행렬 함수
행렬을 다룰 때 자주 쓰이는 함수입니다.
- dim(matrix) : matrix 차원 확인
- dim(matrix) <-c(m,n) : matrix를 m x n 행렬로 변환(벡터도 가능)
- nrow(matrix) : matrix 행의 수 확인
- ncol(matrix) : matrix 열의 수 확인
- matrix[m,n] : matrix의 m행 n열의 원소 출력
- matrix[m,] : matrix의 m 행 출력
- matrix[,n] : matrix의 n 열 출력
- rownames(matrix) : 행 이름 출력
- colnames(matrix) : 열 이름 출력
> matrix_ = matrix(c(1:12),nrow=4)
#차원 확인
> dim(matrix_)
[1] 4 3
# 행렬 변환
> dim(matrix_) <- c(3,4)
> dim(matrix_)
[1] 3 4
#행,열의 수 확인
> nrow(matrix_)
[1] 3
> ncol(matrix_)
[1] 4
# 원소 출력
> matrix_[1,2]
[1] 4
> matrix_[1,]
[1] 1 4 7 10
> matrix_[,2]
[1] 4 5 6
# 행,열 이름 출력
> matrix_ = matrix(c(1:12),nrow=3,dimnames=list(c('r1','r2','r3'),c('c1','c2','c3','c4')))
> rownames(matrix_)
[1] "r1" "r2" "r3"
> colnames(matrix_)
[1] "c1" "c2" "c3" "c4"
행렬 계산
행렬 계산부터는 배열이 중요합니다.
배열이 다르면 아예 계산이 안 됩니다.
# 행렬의 합
> matrix1 = matrix(c(1:12),nrow=4)
> matrix2 = matrix(c(1:12),nrow=4)
> matrix1 + matrix2
[,1] [,2] [,3]
[1,] 2 10 18
[2,] 4 12 20
[3,] 6 14 22
[4,] 8 16 24
#같은 행과 열의 값 곱하기
> matrix1*matrix2
[,1] [,2] [,3]
[1,] 1 25 81
[2,] 4 36 100
[3,] 9 49 121
[4,] 16 64 144
# 전치행렬
> t(matrix1)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
# 역행렬 구하기(정방행렬(square matrix)만 가능)
> matrix3 = matrix(c(1:4),nrow=2)
> solve(matrix3)
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
# 행렬의 곱셈
> matrix1%*%t(matrix2) # matrix1 = 4x3, t(matrix2) = 3x4
[,1] [,2] [,3] [,4]
[1,] 107 122 137 152
[2,] 122 140 158 176
[3,] 137 158 179 200
[4,] 152 176 200 224
마치며
행렬에 대한 전반적인 내용이었습니다.
기본적인 건 다 쓴 것 같네요
관련 포스팅
'R' 카테고리의 다른 글
[R] 데이터 결합하기 (0) | 2022.05.13 |
---|---|
[R] 데이터 프레임 다루기 (0) | 2022.05.06 |
[R] 리스트(list) (0) | 2022.05.03 |
[R] 벡터 다루기(내장함수와 연산) (0) | 2022.04.28 |
[R] 연산자 모음 (0) | 2022.04.26 |