본문 바로가기

Data analysis story

[R 프로그래밍]- Matrix(행렬)

안녕하세요 여러분!

저번 포스팅에서는 R의 데이터 타입 그 두 번째 시간으로 Factor에 대해서 배워보았습니다!

"이번 포스팅에서는 Matrix에 대해 차근차근 공부해보도록 해요!"

먼저 행렬에 대해서는 고등학교 수학에서 배웠었죠?

행렬은 행과 열로 정돈된 실수들의 사각형 배열이라고 할 수 있습니다!

 

 

그림을 보니 다들 기억이 나시죠??

행렬은 우리가 앞서 배운 Vector와 마찬가지로 같은 자료형만 저장 가능합니다. , 벡터와 마찬가지로 문자나 숫자를 동시에 저장할 수 없다는 것이죠! 그렇다면 Vector와 다른 점은 무엇일까요? Vector 1차원! 바로 우리가 오늘 보고자 하는 행렬은 2차원의 구조입니다.

 

그러면 이제 행렬을 생성하는 법을 배워봅시다!

행렬을 생성할 때는 vector(vector 생성은 vector()함수 사용), factor(factor 생성은 factor()함수 사용)와 마찬가지로 matrix()함수를 사용합니다.

 

matrix() 함수에 들어가는 인수들을 소개해드리죠!

matrix (data, nrow, ncol, byrow, dimnames)

matrix(행렬 안에 채울 데이터, 행수, 열수, 배열방식( or 열 부터 데이터 채움), 각 차원의 이름)

이렇습니다! 아직은 너무 어렵죠! 예제를 통해 하나씩 배워볼까요?

 

data, nrow, ncol

행렬에 채울 데이터는 0이라고 가정하고 행의 개수가 3이고 열의 개수가 4인 행렬을 만들어보겠습니다.

 

행의 개수가 3이고 열의 개수가 4인 행렬이 만들어졌죠?

 

덧붙여 dim()함수는 주석에도 쓰여 있듯이 행렬의 행과 열의 개수를 Vector형태로 돌려주는 함수입니다.

dim()함수가 행과 열의 값을 돌려주는 함수니까

dim함수로도 행렬을 생성할 수 있지 않을까요?

한 번 예를 들어보겠습니다!

 

 

이렇게 변수에 데이터를 할당하고

dim()함수에다가 행과 열의 값을 벡터로 넣어주면

행렬이 생성됩니다! 이 방법도 알아두세요!!

 

그런데 앞의 예시의 행렬 결과값을 보면 행과 열의 이름이 정해지지 않아서

행은 [1,], [2,], [3,] 이렇게

열은 [,1], [,2], [,3], [,4] 이렇게 나와있는데요! 이름이 없죠?

 

dinnames

행과 열에 이름을 주는 함수도 있답니다!

앞서 봤던 matrix 함수의 인수 중 dimnames에 관한 것인데요!

밑의 예를 봅시다!

 

dimnames를 설정하지 않았더라면

밑의 행렬의 행의 이름과 열의 이름이

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

[,1], [,2], [,3]

이렇게 출력됐을 텐데요!

 

dimnames라는 인수에다가 행의 이름을 “a”,”b”,”c”,”d”,”e” 이렇게

열의 이름은 “1”,”2”,”3” 이렇게 주니까

이름이 붙여져서 행렬이 출력된 것을 확인할 수 있습니다!

 

그런데 dimnames다음에 list라는 함수가 낯설죠?

바로 다음 시간에 list에 대해 자세히 설명할 것이니 좀만 기다려주세요!


간단하게 얘기하자면 list는 서로 다른 유형을 가진 데이터들로 구성될 수 있으며 서로 다른 길이, 차원으로도 구성될 수 있는 데이터 타입입니다.

 

제가 dimnames라는 인수로 행의 이름과 열의 이름을 한꺼번에 주려다보니

행과 열의 길이가 다르면 이름의 길이도 다를 수도 있기 때문에 list라는 함수를 사용한 것입니다!

 

그런데 이렇게 dimnames라는 인수를 사용하면 코드가 너무 길어지다 보니

행의 이름과 열의 이름을 각각 따로 줄 수 있는 방법도 소개해드릴게요!

 

바로 rownames함수와

colnames함수를 사용하면 되는데요!

 

앞의 예를 똑같이 가지고 설명드려볼게요!

 

아까는 열이름과 행이름을 한꺼번에 주었지만

이번에는 행 이름을 지정하는 함수 rownames

열 이름을 지정하는 함수 colnames를 따로 써서 각각 주었습니다!

좀 더 간편한가요?

 

byrow

그러면 matrix함수 인수들 중 byrow빼고는 다 설명을 드린 것이 되네요!

byrow는 앞애서도 잠깐 언급했지만

행부터 채울 것인지, 열부터 채울 것인지를 결정하는 인수입니다.

백문이 불어일견! 먼저 byrow 인수에 T를 준 것과 F를 준 것을 비교해볼게요!

 

byrow인수를 T로 주면 데이터들이 행 순서로 가로로 채워지고

F로 주면 열 순서대로 세로로 채워지는 것을 알 수가 있죠?

 

"이렇게 해서 행렬을 생성하는 matrix 함수와 matrix (data, nrow, ncol, byrow, dimnames)이 인수들 모두에 대해서 예를 보며 살펴보았습니다!"

 

행렬에 데이터 추가

 

그런데 이 행렬에 데이터를 추가하고 싶을 때에는 어떻게 해야 할까요?

그리고 데이터를 열 옆에 추가하는 경우 혹은 행 밑에 추가하는 경우로도 나뉠 수 있을 것 같은 같은데요!

 

rbind()는 지정한 데이터들을 행으로 취급해 합치는 함수이구요

cbind()는 지정한 데이터들을 컬럼으로 취급해 합치는 함수입니다.

예제를 보며 확인해봅시다!

x에는 1,2,3y에는 10,11,12를 생성한 후 rbind로도 합쳐보고 cbind로도 합쳐보죠!

 

cbind로 합칠 때는 열 옆에 붙여지고 rbind로 합칠 때는 행 밑에 붙여지는 거 보이시죠??

 

 

이제는 기존 데이터에 추가해보겠습니다.

 

위의 예를 보면

1부터 9까지를 행을 3개로 해서 가로로 채우며 행렬을 만들었는데요.

그 행렬을 mat2라는 변수에 할당했습니다. 그런데 이 mat2의 행렬에 10,11,12라는 데이터를 추가하고 싶은 겁니다.

그런데 열 옆에 붙이는게 아니라 행 밑에 붙이고 싶은 것이죠! 그럴 때 바로 rbind를 사용하여 붙여주었습니다!

cbind로 합쳤다면 열 옆에 붙었겠죠??

 

그런데 이렇게 데이터를 행렬에 추가할 때는 주의해야 할 점이 있습니다.

더하려는 데이터의 행과 열의 길이가 기존 데이터와 다른 경우에는 어떻게 될까요?

오류가 발생하니 추가하려는 데이터는 기존의 데이터와 행과 열의 수를 잘 맞추어 추가해주세요!

 

예를 들어 1부터 9로 이루어진 3 by 3 행렬이 있는데

행 밑에 10,11,12,13의 데이터를 추가하려고 해보세요!

데이터가 3개가 들어와야지만 길이가 맞는데 지금 추가하려는 데이터는 4개 잖아요!

결과에 제가 추가하고자 한 13의 데이터는 보이지 않죠? 그리고 경고 메시지가 뜹니다.

 

만약 3보다 적게 두개의 데이터를 넣고자 했다면 데이터가 반복되어 들어갑니다! 예시를 통해 보여드릴게요!

이렇게요! 더 이상 넣을 데이터가 없으니 10을 가지고 와서 반복했죠?

행렬 데이터 추출

그렇다면 이제 행렬에 있는 데이터에는 어떻게 접근할지 보겠습니다!
행렬 데이터 추출은 어떻게 할까요?

벡터의 데이터를 추출할 시에는 [ ] 연산자를 사용했는데요

행렬은 [ , ] 연산자를 사용합니다.

[2,3] 이라고 되어 있으면 2행의 3을 추출한다는 뜻이죠!

어때요? 정말 2행의 3열 값인 6을 추출해왔죠?

그럼 이 외에도 다양한 예제를 소개하겠습니다!

벡터에서 활용했던 방법처럼 자유자재로 추출할 수가 있네요!

그러면 -도 사용할 수 있겠네요!

벡터 때 많이 연습해서 어렵지 않죠? 어렵다 생각되시면 벡터 포스팅을 참고해주세요!

 

그런데 혹시 벡터에서 사용했던 [ ]로도 행렬의 값을 추출할 수 있을까요?

정답은 yes입니다!

그 이유는 이렇습니다.

 

"벡터와 행렬 모두 단일 자료형을 저장한다고 했습니다. 단일 자료형을 저장하는 데이터 타입들은[벡터, 팩터, 행렬] 내부적으로는 그냥 일차원으로 저장됩니다. 똑같은 데이터 타입이기 때문이죠. 따라서 [ ]로도 행렬의 데이터를 추출할 수 있습니다."

 

예를 들어볼게요!

행 순서로(가로로) 데이터를 채웠으니까 가로로 123이렇게 번호를 부여하면

4번째 있는 값은 2, 6번째에 있는 값은 8 이렇게 됩니다!

byrow F로 설정하면 세로로 순서를 부여해주면 되겠죠!

 

그러면 이렇게 숫자로 추출했으니

논리값으로도 추출해봅시다! [이해가 안된다면 벡터 포스팅을 참고해주세요!]

이제 이런 것들을 벡터 때의 많은 연습으로 익숙해지셨을 거라고 믿어요!!

 

마지막으로 이름으로도 추출 가능하다고 했죠?

또 앞서서 행 이름과 열 이름에 이름을 부여하기도 했고요! 그렇게 추출해봅시다!

열 이름과 행 이름을 부여하는 코드부터

그 이름을 가지고 행렬의 값을 추출하는 코드까지 함께 짜볼게요!

여러분도 직접 연습해보시길 바라요!

 

오늘은 이렇게 해서 데이터 타입 그 세번째 시간! 행렬(Matrix)에 대해서 알아보았습니다. 행렬을 생성하는 방법, 행렬 생성 함수 안의 인수들, 그리고 행렬에 데이터를 추가하는 방법과 행렬을 추출하는 법까지! 익숙해지기 위해선 많은 연습이 필요한 거 아시죠??!! ㅎㅎ

다음 시간에는 ListArray를 함께 포스팅하도록 하겠습니다!