8.1 배열의 생성

배열은 2 차원 이상의 데이터를 저장할 수있는 R 데이터 객체입니다. 예를 들어, 3 차원 배열 (2, 3, 4)을 생성하면 각각 2 개의 행과 3 개의 열이있는 4 개의 직사각형 행렬이 생성됩니다. 배열은 데이터 유형만 저장할 수 있습니다.

array() 함수를 사용하여 배열을 만듭니다. 벡터를 입력으로 사용하고 dim 매개 변수의 값을 사용하여 배열을 만듭니다.

array(data = NA, dim = length(data), dimnames = NULL)

  • data : 배열을 생성할 데이터입니다.
  • dim : 배열의 차원을 나타내는 정수형 벡터입니다. 예, dim = c(2, 3, 4)
  • dimnames : 리스트 형태의 각 차원의 이름입니다.

예 다음 예제에서는 2 X 3 X 4 배열을 생성합니다. 이는 2 X 3 행렬이 4개 있는 것과 같습니다. 따라서 전체 요소의 갯수는 2 X 3 X 4 = 24개가 됩니다.

# 2 X 3 X 4 배열을 생성을 위한 요소 data를 생성합니다.
set.seed(10)                              # 난수 발생 지점을 정합니다.
data <- sample(1:20, 24, rep=TRUE)        # 요소 생성 : 1:20 사이의 숫자 24개를 임의로 복원추출합니다. 
data
##  [1] 11  9 10 16 12  8  7 19 15 15 10  7 10  2 13  8 14  7  6  7 18 18 13  5
# 생성된 data를 array() 함수를 이용하여 배열로 전환합니다.
arr.1 <- array(data, dim = c(2, 3, 4))    # 배열을 생성합니다.
arr.1
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]   11   10   12
## [2,]    9   16    8
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]    7   15   10
## [2,]   19   15    7
## 
## , , 3
## 
##      [,1] [,2] [,3]
## [1,]   10   13   14
## [2,]    2    8    7
## 
## , , 4
## 
##      [,1] [,2] [,3]
## [1,]    6   18   13
## [2,]    7   18    5

배열을 생성할 때 제일 왼쪽의 2개의 차원으로 구성되는 행렬이 “기본 행렬”을 이룹니다. 그리고 다음 차원의 갯수가 바로 이 기본행렬의 갯수를 정하는 것입니다. 즉, 위의 에에서 arr.1 베열을 (2 X 3) 행렬을 기본행렬로 하여 이 기본 행렬이 4개 만들어지는 형태의 배열이 되는 것입니다.

한편 배열을 생성할 때 data의 요소의 갯수가 배열의 전체 요소의 갯수와 일치하지 않는 경우의 배열 생성에 대하여 살펴 보겠습니다. 이러한 경우는 data의 요소가 자동 반복(recycling)되어 배열의 요소로 채워집니다.

# 12개의 요소로 구성된 벡터 data를 생성합니다.
set.seed(10)                              # 난수 발생 지점을 정합니다.
data <- sample(1:20, 12, rep=TRUE)        # 요소 생성 : 1:20 사이의 숫자 24개를 임의로 복원추출합니다. 
data
##  [1] 11  9 10 16 12  8  7 19 15 15 10  7
# 2 X 3 X 4 배열을 생성합니다.
arr.2 <- array(data, dim = c(2, 3, 4))     # 배열의 전체 갯수가 24개여야 하는데, data의 요소 갯수는 12개 입니다.
arr.2                                     # data의 12개 요소가 자동 반복되어 배열의 요소로 입력됩니다.
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]   11   10   12
## [2,]    9   16    8
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]    7   15   10
## [2,]   19   15    7
## 
## , , 3
## 
##      [,1] [,2] [,3]
## [1,]   11   10   12
## [2,]    9   16    8
## 
## , , 4
## 
##      [,1] [,2] [,3]
## [1,]    7   15   10
## [2,]   19   15    7

8.1.1 차원의 이름 지정

8.1.1.1 차원별 요소들의 이름 지정

dimnames 매개 변수에 리스트를 사용하여 배열의 각 차원의 요소들에 대한 이름을 지정할 수 있습니다.

# array() 함수에 dimnames 인수에 배열의 각 차원의 이름을 지정합니다.
arr.3 <- array(data, dim = c(2, 3, 4),                            # 2 X 3 X 4 배열을 생성합니다.
                     dimnames = list(c("male", "female"),         # 첫 번째 차원의 이름을 지정합니다.
                                     c("low", "middle", "high"), # 두 번째 차원의 이름을 지정합니다.
                                     c("S", "A", "B", "C")))      # 세 번째 차원의 이름을 지정합니다.
arr.3               # 각 차원의 이름이 출력됩니다.
## , , S
## 
##        low middle high
## male    11     10   12
## female   9     16    8
## 
## , , A
## 
##        low middle high
## male     7     15   10
## female  19     15    7
## 
## , , B
## 
##        low middle high
## male    11     10   12
## female   9     16    8
## 
## , , C
## 
##        low middle high
## male     7     15   10
## female  19     15    7

8.1.1.2 차원의 이름 지정

한편, names() 함수를 이용하여 각 차원의 이름을 지정할 수 있습니다. 즉 첫번째 차원은 “Gender,” 두분째 차원은 “Level” 그리고 세 번째 차원은 “Grade” 등의 이름을 부여해 보겠습니다.

names(dimnames(arr.3)) <- c("Gender", "Level", "Grade")
arr.3                        # 각 차원별로 이름이 지정된 것을 확인할 수 있습니다.
## , , Grade = S
## 
##         Level
## Gender   low middle high
##   male    11     10   12
##   female   9     16    8
## 
## , , Grade = A
## 
##         Level
## Gender   low middle high
##   male     7     15   10
##   female  19     15    7
## 
## , , Grade = B
## 
##         Level
## Gender   low middle high
##   male    11     10   12
##   female   9     16    8
## 
## , , Grade = C
## 
##         Level
## Gender   low middle high
##   male     7     15   10
##   female  19     15    7
str(arr.3)                   # arr.3 배열의 구조를 확인해 보겠습니다.
##  int [1:2, 1:3, 1:4] 11 9 10 16 12 8 7 19 15 15 ...
##  - attr(*, "dimnames")=List of 3
##   ..$ Gender: chr [1:2] "male" "female"
##   ..$ Level : chr [1:3] "low" "middle" "high"
##   ..$ Grade : chr [1:4] "S" "A" "B" "C"