R 할줄 R지? #6 - 2차원 다루기, 매트릭스(Matrix)

    2차원 데이터


    앞서, 벡터(Vector)에 관련된 포스팅을 길게 썼는데 벡터는 1차원 데이터 구조이다. 벡터를 사용하는 경우도 많이 존재하지만, 사실상 벡터보다는 2차원 데이터를 더 많이 사용하게 된다.


    우리가 흔히 사용하는 엑셀(Excel)만 하더라도 행만 사용하는 경우는 단순히 계산하기 위해서 데이터를 넣는 정도를 제외하면 없다고 봐도 무방할 정도이다.


    이번편은 2차원 데이터의 가장 기본적인 매트릭스(Matrix) 명령어를 사용해보고, 다음 포스팅에는 본격적으로 가장 많이 사용하게 될 데이터 프레임(Data.Frame)에 대해서 포스팅 하고자 한다.



    Matrix와 Data.Frame의 차이


    우선 본격적으로 매트릭스에 대한 설명에 앞서 매트릭스와 데이터프레임에 대한 차이를 설명한다면, Matrix를 데이터 타입이 동일해야 되는 구조이고, Data Frame은 오브젝트같이 다루는 형태이다.


    즉, Matrix는 동일한 구조의 데이터가 연속된 형태이고 Data Frame은 열에 따른 구조가 달라도 되는 모양새이다. Java 개발자라면 Matrix와 Data Frame의 차이를 쉽게 이해할 수 있을 것이다.


    Matrix : Map<String, Integer>, Map<String, String>

    Data.Frame : Map<String, Object>

     


    매트릭스 생성, 사용법


    > result <- matrix(1:10, nrow=2, ncol=5)

    > result

         [,1] [,2] [,3] [,4] [,5]

    [1,]    1    3    5    7    9

    [2,]    2    4    6    8   10


    matrix 인자는 첫번째 source, 두번째 행의 개수, 세번째, 열의 개수로 이루어져 있다. 보통 파일을 불러오는 형식이 첫번째에 들어가게 될 테지만, 실습을 원활하게 하기 위해 첫번째 source값에 벡터값을 직접 생성하여 넣었다.


    그러나 데이터가 우리가 생각하는 것과 다르게 생성되는 것을 느꼈을 것이다. 우리의 시선은 일반적으로 행부터 차오르는 것이 익숙하기 때문이다. 이럴 경우, 행부터 데이터를 채우는 인자값을 추가해야 한다.


    > result2 <- matrix(1:10, nrow=2, ncol=5, byrow=T)

    > result2

         [,1] [,2] [,3] [,4] [,5]

    [1,]    1    2    3    4    5

    [2,]    6    7    8    9   10


    byrow=T를 지정하면, 이와같이 우리에게 익숙하게 행부터 데이터를 채우고 열로 빠지는 구조가 된다.



    벡터 합쳐서, 매트릭스 생성


    벡터들을 합쳐서 새로운 매트릭스를 생성할 수 있고, 매트릭스에 벡터를 추가할 수 있는 방식이 있다.


    > a <- 1:10

    > b <- 11:20

    > c <- 21:30

    > a

     [1]  1  2  3  4  5  6  7  8  9 10

    > b

     [1] 11 12 13 14 15 16 17 18 19 20

    > c

     [1] 21 22 23 24 25 26 27 28 29 30


    우선 위와 같이 3개의 벡터를 생성하였다. 각각 a,b,c는 1~10, 11~20, 21~30의 값을 넣었다.


    > cmerge <- cbind(a,b,c)    # a,b,c를 컬럼 단위로 합친다

    > cmerge

           a  b  c

     [1,]  1 11 21

     [2,]  2 12 22

     [3,]  3 13 23

     [4,]  4 14 24

     [5,]  5 15 25

     [6,]  6 16 26

     [7,]  7 17 27

     [8,]  8 18 28

     [9,]  9 19 29

    [10,] 10 20 30


    cbind라는 펑션을 사용하게 되면, 안에 있는 벡터값을 컬럼 단위로 합치게 된다. 합친 매트릭스 구조를 cmerge라는 변수에 담았다


    > cmerge <- cbind(cmerge,b)

    > cmerge

           a  b  c  b

     [1,]  1 11 21 11

     [2,]  2 12 22 12

     [3,]  3 13 23 13

     [4,]  4 14 24 14

     [5,]  5 15 25 15

     [6,]  6 16 26 16

     [7,]  7 17 27 17

     [8,]  8 18 28 18

     [9,]  9 19 29 19

    [10,] 10 20 30 20


    cbind는 벡터만 인자값을 받지 않는다. 위와 같이 cbind(cmerge, b) 라는 기존 매트릭스에 b의 벡터값을 추가하는 방식도 된다는 것을 알 수 있다.


    > cmerge <- cbind(cmerge, cmerge)

    > cmerge

           a  b  c  b  a  b  c  b

     [1,]  1 11 21 11  1 11 21 11

     [2,]  2 12 22 12  2 12 22 12

     [3,]  3 13 23 13  3 13 23 13

     [4,]  4 14 24 14  4 14 24 14

     [5,]  5 15 25 15  5 15 25 15

     [6,]  6 16 26 16  6 16 26 16

     [7,]  7 17 27 17  7 17 27 17

     [8,]  8 18 28 18  8 18 28 18

     [9,]  9 19 29 19  9 19 29 19

    [10,] 10 20 30 20 10 20 30 20


    당연히 위와 같이 매트릭스만을 인자로 줘서 병합할 수도 있다.


    컬럼(열)기반으로 합쳤으니, 이제 행 기반으로 합치는 명령어를 해보자. 어느정도 눈치챘겠지만, cbind 대신에 rbind를 사용하면 된다.


    > rmerge <- rbind(a,b,c)

    > rmerge

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]

    a    1    2    3    4    5    6    7    8    9    10

    b   11   12   13   14   15   16   17   18   19    20

    c   21   22   23   24   25   26   27   28   29    30


    rbind 역시, cbind처럼 매트릭스의 병합도 물론 가능하다.



    매트릭스 데이터 지정


    > result2

         [,1] [,2] [,3] [,4] [,5]

    [1,]    1    2    3    4    5

    [2,]    6    7    8    9   10

    > result2[1,3] # 1행 3열에 있는 데이터 지정

    [1] 3

    > result2[2,5] # 2행 5열에 있는 데이터 지정

    [1] 10


    매트릭스변수[행위치,열위치] 이와 같은 명령어로 데이터를 지정할 수 있다.



    > result2[1,] # 1행에 있는 벡터값을 가져온다

    [1] 1 2 3 4 5

    > result2[,4] # 4열에 있는 벡터값을 가져온다

    [1] 4 9


    행위치나 열위치에 공백을 넣게되면 해당 위치의 행이나 열의 값을 모두 가져오라는 말이 된다.



    값에 이름 부여하기


    엑셀에 우리가 컬럼위치에 명칭을 붙이는 것처럼 매트릭스에도 이름을 부여할 수 있다.


    > rownames(result2) <- c("r1","r2")

    > result2

       [,1] [,2] [,3] [,4] [,5]

    r1    1    2    3    4    5

    r2    6    7    8    9   10


    rownames라는 명령어로 행에 이름을 부여할 수 있다. 행에 이름을 부여할 때는 벡터값으로 생성 후 rownames(매트릭스변수)에 대입한다. 위 예제는 r1, r2라는 벡터 행을 만들었고, result2에 부여하였다.



    > colnames(result2) <- c("c1","c2","c3","c4","c5")

    > result2

       c1 c2 c3 c4 c5

    r1  1  2  3  4  5

    r2  6  7  8  9 10


    동일한 방식으로 컬럼명도 부여할 수 있다. c1,c2,c3,c4,c5라는 벡터를 생성하여 colnames의 펑션에 값을 부여한다.



    이름으로 값 찾기


    > result2["r1",]

    c1 c2 c3 c4 c5 

     1  2  3  4  5 

    > result2[,"c3"]

    r1 r2 

     3  8 

    > result2["r2","c4"]

    [1] 9


    행과 열의 이름을 생성하게 되면, 기존의 매트릭스 행,열 위치값으로 찾았던 방식 대신에 이름으로 찾을 수 있게 된다.



    이전자료


    댓글

    Designed by JB FACTORY