본문 바로가기

데이터와 AI/R 기초

[R기초-3] Matrix란

반응형

앞서 벡터에 대해 다루고 이해했다면, 이번엔 매트릭스와 데이터 프레임에 대해 정리해 보겠다.

매트릭스는 우리말로 '행렬'이라는 뜻이다. 행과 열을 갖는 m*n형태의 사각형에 데이터를 나열한 데이터 구조이다.

 

직접 손으로 쓸때야 큰 괄호안에 숫자를 넣었지만 컴퓨터는 그렇지 않다.

기본적으로 열을 우선으로 채우며, 함수의 옵션을 통해 이를 수정하는 것이 가능하다.

대충 이정도만 알아도 이용하는 데 큰 문제 없으므로 바로 실습에 들어가보자.

 

※ 최종 수정(21-01-09)


 

1. Matrix의 생성

    - 첫번째 인자는 넣을 값, 두번째 인자는 행 개수, 세번째 인자는 열개수, 네번째 인자는 행 또는 열 방향을 지정한다.

z <- matrix(1:20,nrow=4, ncol=5, byrow=T) #byrow가 T(True)이므로 행우선으로 값이 채워진다.
# 아래 그림과 같이 출력된다.

 

2. cbind, rbind 함수

    - 이젠 함수 이름만 보고 유추해볼 수 있을 것 같다.

    - 'c'로 시작하니까 column(열) 단위로 bind(묶다, 병합하다)하는 함수다. rbind역시 비슷하다.

    - 사용 방법은 아래와 같다.

    - 참고로, 굳이 rbind를 다루지 않는 이유는 행 우선으로 채운다는 것 외에 cbind랑 동일하기 때문이다.

x <- 1:4; y<-5:8
m1 <- cbind(x,y) #열단위로 병합된다. x가 기준이 된다. 1열에 1,2,3,4가 들어가고 2열에 5,6,7,8이 들어간다.
m2 <- rbind(x,y) #행단위로 병합된다. 역시 x가 기준이 된다. 1행에 1,2,3,4가 들어가고 2행에 5,6,7,8이 들어간다.

    - 마치 뭐랄까, 너무 싱겁다. 원소개수가 같아서 문제가 없다. 테스트에 문제가 없다는 건 이상하다.

    - 그래서 오히려 문제를 일으켜봤다. R studio의 반응이 궁금하다.

x <- 1:4; y <- 5:6     # x가 4개, y가 2개의 원소를 가지고 있다.
m1 <- cbind(x,y)      # x는 정상적으로 1열에 들어가는데, 문제는 2열에 있다. 2열에는 5,6,5,6이 들어간다.

x<- 1:4; y <- 5:10    # x가 4개, y가 6개의 원소를 가지고 있다
m1 <- cbind(x,y)     # 드디어 R studio가 오류를 뱉어냈다.
                          # number of rows of result is not a multiple of vector length란다.
                          # 즉, y의 개수가 x의 길이의 배수가 아니라는 오류다.

    - 문제를 일으킴으로서 2가지를 알았다.

    - cbind,rbind 함수의 2번째 인자(벡터)는 반드시 첫째 인자(벡터)의 길이의 배수여야 한다는 것이다.

    - 만약, 배수를 다 채우지 못한다면 두번째 인자를 복제하여 첫째인자의 길이만큼 집어 넣는다.

 

3. Matrix안의 원소 출력하기

    - 이미 앞서 벡터를 다룰때 잠깐 맛봤었다.

    - 거두절미하고 바로 예시부터 보자.

x <- 1:4, y <-5:8
m1 <- rbind(x,y)
x[2,3]  # 2행3열의 원소를 출력한다. 7이 출력된다.
x[2,]    # 2행의 모든 원소를 출력한다. '[1] 5,6,7,8'이 출력된다. [1]은 1행이라는 뜻이다.
x[,2]    # 2열의 모든 원소를 출력한다. 2,6이 출력된다.
         # 소소하게 출력의 차이점은 2,6위에 x,y가 출력된다는 것이다.
x[-2,-3] # 이 방식은 이용 불가능 하다. 하나의 행 또는 하나의 열만 제거하여 출력 가능하다
x[-2,]    # 2행만 빼고 출력한다
x[,-3]    # 3열만 빼고 출력한다

 

4. rownames, colnames

    - 각 행, 열에 이름을 붙여주는 함수다.

    - 당연히 기존 입력된 matrix의 행/열과 입력되는 행/열의 이름 개수가 맞아야 정상적으로 입력될 것 같다.

    - 그냥 하면 밋밋하니, 역시 문제를 일으켜본다.

x <- 1:4; y<-5:8
m1 <- rbind(x,y)
rownames(m1) <- c("a","b","c","d","e") # 2행짜리에 이름이 5개니 당연히 오류날 것 같다.
                                                  # not equal to array extend. array범위와 동일하지 않다는 오류다.
                                                  # 왜 matrix가 아니라 array라고 나오는지는 모르겠다.
rownames(m1) <- c("a")                   # 2행짜리에 이름을 1개만 넣었다. 역시 같은 오류가 출력된다.
x["a",]                                           # 참고로 이름을 넣고나면 이렇게 쓸 수 있다. 코드 읽기가 쉬워졌다.

    - 문제를 일으켜 본 결과, 그냥 이름은 길이에 맞게 넣어주자. 아님 아예 쓰지 않던가...

 

 

matrix까지는 역시나 직관적이어서 크게 어려운 부분은 없었다.

다음에는 Data Frame에 대해서 정리해 보겠다.

 

 

 

 

 

 

 

 

반응형