이제까지 R 벡터를 가지고 놀아보았습니다. 이전 포스팅에서는 R 벡터를 합치면 행렬이 된다는 것을 알았는데요, 이번 포스팅에서는 벡터의 연장선으로써 R 행렬을 가지고 놀아봅시다.

R 행렬이란 무엇일까?

R 행렬이란, 앞에서 배운 벡터들을 모아서 만든 객체입니다. 좀 더 좀 더 구체적으로 이야기하면 길이가 같은 벡터들을 사각형 모양으로 묶어 놓았다고 생각하면 좋겠습니다. 수학에서의 행렬의 의미와 거의 똑같죠?

r 행렬 만들기 - r 행렬은 벡터들의 모임으로 볼 수 있습니다.
위 그림은 가로 벡터 5개가 모여만든 행렬로 생각할 수 있겠죠?

벡터들을 모아놓은 것

행렬은 일련의 벡터들을 모아놓은 사각형 모양의 구조를 띕니다. 이는 반드시 사각형의 형태를 가져야 하며, 이 사각형의 크기는 dim() 함수를 통해 측정할 수 있습니다. 아래의 예제에서 cbind(1:4, 12:15)는 두 개의 벡터를 합쳐 하나의 행렬을 생성합니다.

cbind(1:4, 12:15)
>>      [,1] [,2]
>> [1,]    1   12
>> [2,]    2   13
>> [3,]    3   14
>> [4,]    4   15

dimension의 줄임말인 dim() 함수는 행렬의 크기를 재어주는 함수입니다.

dim(cbind(1:4, 12:15))
>> [1] 4 2

결과를 보니, “가로로 4행, 세로로 2열에 해당하는 크기의 숫자들이 들어있다.”라고 해석 할 수 있겠네요.

R 행렬 만들기

R에서 행렬matrix 생성하는 데에는 matrix() 함수를 사용합니다. 이 함수는 행렬을 만들 때 필요한 정보들; 행렬을 채울 숫자들, 행의 개수, 열의 개수 등을 입력값으로 받습니다.

  • 문법: matrix(숫자, 행개수, 열개수, 채우는 방향)

R 빈 행렬 만들기

빈 벡터를 만들 때도 vector() 함수에 값을 넣지 않고 길이를 지정해주면 되었는데, 빈 행렬을 만드는 것도 마찬가지 입니다. 다음은 2행 2열에 해당하는 빈 행렬을 만들어서 y 변수에 저장하는 코드입니다.

y <- matrix(nrow = 2, ncol = 2)
y
>>      [,1] [,2]
>> [1,]   NA   NA
>> [2,]   NA   NA

채우면서 만들기

아래의 코드는 1부터 4까지의 수를 원소로 갖는 2개의 행과 열로 이루어진 행렬 y를 생성합니다.

y <- matrix(1:4, nrow = 2)
y
>>      [,1] [,2]
>> [1,]    1    3
>> [2,]    2    4

행렬의 크기는 무조건 사각형이므로, 행의 수(nrow)나 열의 수(ncol) 중 하나만 입력 받아도 자동으로 행렬의 크기를 계산하여 만들어 줍니다.

행렬을 채우는 방법 – byrow 옵션

r 행렬 만들기 - 채우는 방향 옵션은 byrow를 사용합니다.
행렬에 숫자를 채우는 방향은 가로, 세로 방향 2가지가 있습니다.

행렬을 생성하며 원소들을 채울 때, byrow 옵션을 사용하여 원소들이 행렬에 채워지는 방향을 정할 수 있습니다. 세로로 원소들을 채우려면, byrow 옵션을 사용하지 않거나 byrow = FALSE를 설정합니다.

아래 코드는 1부터 4까지의 연속된 숫자로 행렬 생성을 하되, 숫자들을 기본적으로 세로 방향으로 채워 나갑니다.

y <- matrix(1:4, nrow = 2)
y
>>      [,1] [,2]
>> [1,]    1    3
>> [2,]    2    4

반면에 가로로 원소들을 채우려면, byrow = TRUE를 설정합니다.

y <- matrix(1:4, nrow = 2, byrow = TRUE)
y
>>      [,1] [,2]
>> [1,]    1    2
>> [2,]    3    4

R 행렬 인덱싱 (Indexing)

행렬 인덱싱을 좀 더 자세히 알아보기 위해서 좀 더 큰 예제 행렬 을 만들겠습니다. 아래 코드는 1부터 10까지의 수에 2를 곱한 값들을 원소로 갖는 5행 2열의 행렬 x를 생성합니다.

x <- matrix(1:10 * 2, ncol = 2)
x
>>      [,1] [,2]
>> [1,]    2   12
>> [2,]    4   14
>> [3,]    6   16
>> [4,]    8   18
>> [5,]   10   20

R 행렬 원소 추출

행렬의 특정 원소에 접근하는 방법을 인덱싱(Indexing)이라고 합니다. 행렬 내에서 특정 위치의 원소는 접근하고자 하는 행렬 뒤에 대괄호 안 순서쌍 형태로 표시하여 나타낼 수 있습니다. 순서쌍 문법은 [row, col]로, 예를 들어 1행 2열에 위치한 원소는 [1, 2]로 표현합니다.

  • 문법: 행렬[행위치, 열위치]
  • 행렬 A의 1행 2열에 위치한 원소: A[1, 2]

그리고 x[1, 2]는 행렬 x에서 1행 2열의 원소를 반환합니다.

y[1, 2]
>> [1] 2

R 행렬 추출 – 전체를 나타내는 빈 칸

특정 열이나 행의 모든 원소에 접근하려면, 내가 전체 선택하고 싶은 것의 인덱스에 빈 칸을 사용합니다.

R 행렬 열 추출

예를 들어 x[, 2]는 행렬 x의 두 번째 열의 모든 원소를 반환합니다.

x[, 2]
>> [1] 12 14 16 18 20

R 행렬 행 추출

만약 행렬 x의 3번째 행을 추출하기 위해서는 어떻게 해야할까요? 이번에는 반대로 x의 모든 열을 선택해야하기 때문에, 다음과 같이 코드를 작성하면 됩니다.

x[3, ]
>> [1]  6 16

선택적으로 골라오기

특정 열에서 선택적으로 원소를 골라오려면, 행의 위치를 나타내는 곳에 원하는 행의 번호를 넣습니다. 예를 들어 x[c(2, 3, 5), 2]는 행렬 x의 두 번째 열에서 두 번째, 세 번째, 다섯 번째 행의 원소를 반환합니다.

x[c(2, 3, 5), 2]
>> [1] 14 16 20

R 행렬 필터링 (Filtering)

TRUEFALSE를 원소로 가진 벡터를 사용하여 행렬에서 원하는 원소를 필터링 할 수 있습니다. 예를 들어, x[c(TRUE, TRUE, FALSE, FALSE, TRUE), 1]은 행렬 x의 첫 번째 열에서 첫 번째, 두 번째, 다섯 번째 행의 원소를 선택하여 반환합니다.

x[c(TRUE, TRUE, FALSE, FALSE, TRUE), 1]
>> [1]  2  4 10

조건문 사용한 필터 가능

또한, 조건문을 사용하여 원하는 조건을 만족하는 원소를 필터링할 수 있습니다. 예를 들어, x[x[, 2] > 15, 1]은 행렬 x의 두 번째 열의 원소가 15보다 큰 행의 첫 번째 열의 원소를 선택하여 반환합니다.

x[x[, 2] > 15, 1]
>> [1]  6  8 10

본 포스팅은 R 프로그래밍 기초 공략.zip 교재의 일부분 입니다. 본 교재는 R을 독학하시는 분들을 위하여 특별히 제작된 교재입니다. R을 이제 막 시작하셨다면 슬기로운 통계생활과 같이 공부해보세요!

관련 글 보기