Intro) 아래 내용은 R의 기본적인 문법이나 자주 사용되는 라이브러리에 대해 앞으로 정리한 것입니다. 강필성 교수님의 [데이터 분석을 위한 프로그래밍 언어] 강의와 기타 자료들을 토대로 한 내용이지만 야매로 정리하다 보니 오류가 있을 수도 있습니다. 피드백 주시면 빠르게 수정하도록 하겠습니다.

1) matrix의 개요

matrix는 일반적으로 행렬이라고 번역되는 데이터 형태로 '차원(dimension)을 가지는 vector'라고 정의할 수 있습니다. 정의에서 알 수 있듯이 matrix의 뿌리는 vector이며 따라서 vector를 matrix로 변환할 수 있고 vector 뿐만 아니라 list 또한 vector로 변환이 가능합니다.  아래와 같이 A라는 vector와 B라는 list를 만들고 각각에 2X5차원을 부여하게 되면 matrix 형태로 변환이 됩니다. 

#### matrix의 차원 개념 ####
# 1부터 10까지의 vector생성
A <- 1:10 
dim(A)
print(A)

# vector를 차원을 가지는 matrix로 변환
dim(A) <- c(2,5)
print(A)

vector를 matrix 형태로

#### matrix의 차원 개념 ####
# 1부터 10까지의 list생성
B <- list(1,2,3,4,5,6)
print(B)
dim(B)

# list를 차원을 가지는 matrix로 변환
dim(B) <- c(2,3)
print(B)

list를 matrix 형태로

matrix의 특징을 살펴보면 vector와 크게 차이가 없습니다. 기본적으로 인덱스는 1부터 시작하게 됩니다. 앞서 살펴보았던 vector, list 모두 첫번째 인덱스 값은 1이었고 vector 또한 마찬가지입니다. 한편, matrix는 차원을 가지기 때문에 행(row)과 열(column)의 개념을 가지게 됩니다. 따라서, 값을 주어 이를 matrix 형태로 표현하기 위해서는 값들을 어떤 식으로 배열할 것인지가 중요하게 됩니다. R에서 matrix는 열 우선(column-major order)의 배열 구조를 default로 하고 있습니다. 물론, matrix() 함수의 파라미터를 행 우선으로 하여 matrix를 생성할 수 있습니다. 이는 아래에서 직접 R스크립트를 통해 살펴보도록 하겠습니다.

열을 기준으로 하여 matrix가 구성되어 있다

아래 2개의 그림을 통해 열 우선의 배열(colmun-major order)과 행 우선의 배열(row-major order)을 시각적으로 확인해보겠습니다. 

출처: https://huilife.tistory.com/15

2) matrix 생성

matrix를 만드는 방법을 알아보도록 하겠습니다. 앞선 포스트에서 vector와 list를 만드는 다양한 방식들이 있었듯이 matrix  또한 생성하는 방법이 여러가지가 있습니다. 세 방식 모두 matrix() 함수를 사용하지만 세부적인 파라미터 값을 달리하거나 순서를 달리하여 matrix를 생성하게 됩니다. 첫 번째는 가장 일반적인 방법으로 1) matrix의 모든 요소값과 함께 행과 열을 지정해주는 것입니다. 아래와 같이 matrix() 안에 1:12까지의 element, nrow =4, ncol =3를 넣게 되면 1부터 12까지 4X3 형태의 matrix가 완성된다. 이때 행과 열의 값은 element의 값과 호환이 되어야 한다. 가령, 1부터 20까지의 element를 가지고 matrix를 만들기 위해서는 1X20, 2X10, 4X5, 5X4, 10X2, 20X1와 같이 matrix의 크기가 element의 수와 일치해야 한다. 또한, 이러한 점 때문에 행의 수나 열의 수가 결정되면 자동적으로 반대의 열과 행의 수가 결정되기 때문에 굳이 nrow 값과 ncol 값 두 가지 다 넣지 않더라도 하나의 값만 가지고도 matrix를 생성할 수 있다. 아래 R스크립트 결과를 통해 각각의 경우를 살펴보겠습니다. 

앞서 matrix()의 파라미터를 통해 열 우선 배열을 행 우선 배열로 설정할 수 있다고 했는데 다음의 결과를 통해 확인해보겠습니다. 위의 결과와 달리 1,2,3,4,5,6,7,8... 의 배열이 행을 기준으로 나열되어 있습니다. 이처럼 byrow = TRUE를 설정해주면 열 기준의 배열을 행 기준의 배열로 바꿀 수 있습니다. 

matrix를 생성하는 두 번째 방법은 2) 빈 matrix를 만들고 각 element를 직접 채우는 것입니다. 그다지 추천할 만한 방법은 아니지만 이러한 방식으로도 가능하다는 점을 알려드리고 이 원리를 이용하면 생성된 matrix의 element를 다른 값으로 바꿀 수도 있습니다. 아래 R스크립트 결과를 보면 2X2 형태의 빈 matrix를 만들고 각각의 위치에 원하는 값을 직접 입력하게 됩니다. 

이처럼 각 위치 값을 인덱싱하여 값을 부여할 수 있다는 것은 새로운 값으로 대체할 수도 있다는 것을 의미합니다. 1행 1열의 값이 원래 1로 설정되어 있는데 이를 10으로 바꿔보도록 하겠습니다.  

#### matrix 생성 ####
# 행과 열을 지정해 matrix 생성
A = matrix(1:12, nrow=4, ncol=3)
A

# nrow 값만 가지고 matrix 생성
A = matrix(1:12, nrow=4)
A

# ncol 값만 가지고 matrix 생성
A = matrix(1:12, ncol=3)
A

# byrow 인자를 통해 행 우선 배열의 matrix 생성
B = matrix(1:12, nrow=4, byrow = T)
B

# 빈 matrix를 채우는 방식으로 생성
C = matrix(nrow=2,ncol=2)
C[1,1] = 1
C[1,2] = 2
C[2,1] = 3
C[2,2] = 4
C

# 1행 1열의 값을 10으로 바꾸기
C[1,1] = 10
C

'Python-R' 카테고리의 다른 글

[R] 데이터 타입 - List  (0) 2022.07.01
[R] 데이터 타입 - Vector  (0) 2022.06.30

+ Recent posts