[R] 행렬(matrix) 다루기

반응형
반응형

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] 리스트(list)

'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

데이터목장님의
글이 좋았다면 응원을 보내주세요!

Designed by JB FACTORY