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