[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

    ....