IT/프로그래밍 언어

[R] binding & array

Type-유 2024. 1. 25. 18:02

바인딩

cbind() : Take a sequence of vector, matrix or data-frame arguments and combine by columns, respectively. These are generic functions with methods for other R classes.

 

vector와 matrix, 그리고 data-frame을 열을 기준으로 바인딩할 수 있는 함수이다.

 

rbind()는 위와 같은 특성을 띄지만 행을 기준으로 바인딩 시키는 함수이다.

> a <- c(1,2,3,4)
> b <- c(2,4,8,16)

> cbind(a,b)
     a  b
[1,] 1  2
[2,] 2  4
[3,] 3  8
[4,] 4 16

> rbind(a,b)
  [,1] [,2] [,3] [,4]
a    1    2    3    4
b    2    4    8   16

 

 

위의 설명에서도 알 수 있듯 cbind, rbind 함수는 벡터만을 다루지 않고 행렬과 데이터프레임을 다룰 수도 있다.

 

아래에서는 위의 예제를 통해 생성된 행렬을 이용하여 행렬에 대한 특성을 이해해보려고 한다.

> x <- cbind(a,b)
> y <- rbind(a,b)
> x
     a  b
[1,] 1  2
[2,] 2  4
[3,] 3  8
[4,] 4 16
> y
  [,1] [,2] [,3] [,4]
a    1    2    3    4
b    2    4    8   16

 

인덱스를 통한 자료 확인& 전치 행렬

# R에서 행렬은 "행렬이름[행,열]"로 정의되며 각 행렬의 번호는 1부터 시작한다.

# x의 열은 2까지 이므로 다음 실행은 오류를 발생시킨다.
> x[,4]
x[, 4]에서 다음과 같은 에러가 발생했습니다:첨자의 허용 범위를 벗어났습니다

> x[4,]
 a  b 
 4 16 

> x[2,2]
b 
4 

# ':'를 활용해 범위를 입력할 수 있다. 아래의 입력은 1,2행의 2열 데이터를 불러온 것이다.
> x[1:2,2]
[1] 2 4

# 인덱스의 앞에 '-'를 붙이면 해당 인덱스에 해당하는 데이터를 제외하고 불러올 수 있다.
> x[-3,]
     a  b
[1,] 1  2
[2,] 2  4
[3,] 4 16

# t()는 전치행렬을 생성하는 함수이다. 위의 x와 y는 전치행렬 관계이므로 이를 비교해보자.
> t(x)==y
  [,1] [,2] [,3] [,4]
a TRUE TRUE TRUE TRUE
b TRUE TRUE TRUE TRUE

> t(x)
  [,1] [,2] [,3] [,4]
a    1    2    3    4
b    2    4    8   16

 

음수첨자(negative subscript, '-')는 다른 프로그래밍 언어에서는 보기 힘든 R의 유용한 기능이니 기억해두면 좋겠다.

matrix 할당

# 2행 4열의 행렬을 생성하고, 데이터는 1~8로 할당한다.
> mat2by4 <- matrix(1:8, nrow = 2, ncol = 4)

# 숫자를 순서대로 할당할 때, 열에 대하여 우선 할당하는 경향이 있다.
> mat2by4
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8

 

만약 숫자를 행에 우선으로 할당하고 싶은 경우는 기본설정되어 있는 인자를 바꾸어주면 된다.

# 'matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)' 
# 여기서 byrow를 변경해주면 된다.

> mat2by4byrow <- matrix(1:8, nrow = 2, ncol = 4, byrow = TRUE)
> mat2by4byrow
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8

 

3차원 배열

array('data', dim =...) 함수를 통해 3차원 배열을 만들 수 있다.

# 차원을 설정하는 'dim'인자를 통해 행렬의 구조를 설정한다.
> arr2by4by3 <- array(1:24, dim = c(2,4,3))
> arr2by4by3
, , 1

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

, , 2

     [,1] [,2] [,3] [,4]
[1,]    9   11   13   15
[2,]   10   12   14   16

, , 3

     [,1] [,2] [,3] [,4]
[1,]   17   19   21   23
[2,]   18   20   22   24

 

다음은 3차원 배열의 데이터를 조회하는 방법이다. 헷갈릴 수 있으니 위의 기본 데이터 구조와 잘 대조하여 이해할 필요가 있다.

> arr2by4by3[1,,]
     [,1] [,2] [,3]
[1,]    1    9   17
[2,]    3   11   19
[3,]    5   13   21
[4,]    7   15   23

> arr2by4by3[1,-4,]
     [,1] [,2] [,3]
[1,]    1    9   17
[2,]    3   11   19
[3,]    5   13   21

# 음수첨자(-)를 통해 여러 데이터를 제거하고 싶은 경우 벡터 형식으로 넘겨주면 된다.
> arr2by4by3[1,c(-3,-4),]
     [,1] [,2] [,3]
[1,]    1    9   17
[2,]    3   11   19

 

벡터, 행렬, 배열을 다룸에 있어서 길이나 차원 등의 구조를 파악하는 것은 중요하다. length()와 dim()함수를 통해 이를 확인 할 수 있다.

# length() 해당 배열에 할당된 데이터의 수라고 생각해도 될 것 같다.
> length(arr2by4by3)
[1] 24

> dim(arr2by4by3[1,2:3,])
[1] 2 3

> arr2by4by3[1,2:3,]
     [,1] [,2] [,3]
[1,]    3   11   19
[2,]    5   13   21