8.3 다차원 배열의 변환과 요약

다차원 배열은 차원의 수가 늘어날 수록 배열을 적절하게 처리하는 것이 어려워 집니다. 이러한 문제를 해결하기 위한 방법에 대하여 살펴 보겠습니다.

첫 번째 방법은 자료를 원하는 형식으로 변형하는 것입니다. 이를 위한 방법이 배열의 차원을 재배열하는 것입니다.

두 번째 방법은 자료를 요약하여 차원의 수를 줄이는 것입니다. 이를 위해 배열을 큰 표로 만들고 차원을 줄이는 방법입니다.

세 번째 방법은 요약정보를 산출하는 것입니다.

세 번째 방법은 배열을 데이터 프레임 표로 변환하는 것입니다.

다음에서 이러한 방법에 대하여 학습하겠습니다.

8.3.1 차원의 순서 바꾸기 (재배열)

앞의 arr.3 배열을 예로 설명하겠습니다. 이 배열을 출력해 보면 세 번째 차원인 “Grade” 등급별로 첫 번째 차원은 “Gender” 차원과 두 번째 차원인 “Level” 차원이 비교하는 행렬이 출력되고 있습니다.

그런데 이를 “Gender”별로 “Grade” 차원과 “Level” 차원을 비교하는 결과로 출력하고 싶다고 가정해 보지요. 즉 원래 arr.3 배열의 첫 번째 차원과 세 번째 차원을 바꿔서 재배열을 하고자 하는 것입니다.

이러한 배열의 차원을 재배열하는데 사용하는 함수가 aperm() 함수입니다.

aperm() 함수의 형식은 다음과 같습니다.

aperm(a, perm, ...)

  • a : 전환하고자 하는 배열
  • perm : 첨자 순열 벡터입니다. 일반적으로 정수 1:n의 순열입니다. 여기서 na의 차원 수 입니다.

앞의 arr.3 배열의 예를 aperm() 함수를 이용하여 구현해 보겠습니다.

arr.3                     # 1차원과 2차원의 행렬을 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
# perm = c() 함수를 이용하여 ()안에 원하는 차원의 번호를 순서대로 기입합니다. c(3, 2, 1)
arr.4 <- aperm(arr.3, perm = c(3, 2, 1))   # 차원의 배열을 3차원, 2차원, 1차원 순으로 재별합니다.
arr.4                     # 이제 Grade와 Level로 구성된 기본 행렬이 Gender 별로 출력됩니다.
## , , Gender = male
## 
##      Level
## Grade low middle high
##     S  11     10   12
##     A   7     15   10
##     B  11     10   12
##     C   7     15   10
## 
## , , Gender = female
## 
##      Level
## Grade low middle high
##     S   9     16    8
##     A  19     15    7
##     B   9     16    8
##     C  19     15    7
# perm = c(1, 3, 2)로 해서 배열을 재배열해 보겠습니다. 
# 1차원인 Gender와 3차원인 Grade가 기본행렬이 되고 이를 Level별로 출력하는 형태가 될 것입니다.
arr.5 <- aperm(arr.3, perm = c(1, 3, 2)) 
arr.5
## , , Level = low
## 
##         Grade
## Gender    S  A  B  C
##   male   11  7 11  7
##   female  9 19  9 19
## 
## , , Level = middle
## 
##         Grade
## Gender    S  A  B  C
##   male   10 15 10 15
##   female 16 15 16 15
## 
## , , Level = high
## 
##         Grade
## Gender    S  A  B  C
##   male   12 10 12 10
##   female  8  7  8  7

이렇게 배열의 차원을 재배열함으로써 기본 행렬의 구성을 우리가 원하는 형태로 지정하면, 배열에 담긴 정보를 이해하는데 도움이 될 것입니다.

8.3.2 큰 표로 만들기

배열에 있어서 3번째 이후의 차원을 독립된 행렬이 아닌 하나의 행렬 형태로 모두 출력하여 하나의 큰 표로 만든다면 배열에 담긴 정보를 이해하는데 도움이 될 것입니다.

이러한 다차원을 배열을 2차원 행렬 형태의 큰 표로 만들 때 사용하는 함수할 수 있는 함수는 stats 패키지에 있는 ftable() 함수입니다.

ftable() 함수의 기본 형식은 다음과 같습니다.

ftable(x, ..., exclude = c(NA, NaN), row.vars = NULL, col.vars = NULL)

  • x : 인자(문자열 포함)로 해석되거나, 리스트 (또는 데이터 프레임)로 해석될 수 있는 R 객체, 또는 “table”이나 “ftable”의 분할 테이블 객체
  • row.vars : 플랫 분할표의 행에 사용할 변수의 수를 제공하는 정수형 벡터 또는 변수의 이름을 제공하는 문자형 벡터.
  • col.vars : 플랫 분할 표의 열에 사용할변수의 수를 제공하는 정수형 벡터 또는 변수의 이름을 제공하는 문자형 벡터.

arr.3의 예를 살펴 보겠습니다.

# 패키지 설치와 불러오기
# install.packages("stats")
library(stats)

# row.vars = c(1,3)과 정수형 벡터를 지정하는 경우입니다.
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
ftab.1 <- ftable(arr.3, row.vars = c(1, 3))    # 1번째, 3번째 차원을 큰 표의 행에 함께 나열합니다.
ftab.1                                         # Gender, Grade 가 표의 행에, 열에는 Level이 표시가 됩니다.
##              Level low middle high
## Gender Grade                      
## male   S            11     10   12
##        A             7     15   10
##        B            11     10   12
##        C             7     15   10
## female S             9     16    8
##        A            19     15    7
##        B             9     16    8
##        C            19     15    7
# row.vars = c(3)으로 해서 큰 표의 각 행에 3번째 차원만 표현해 보겠습니다.
ftab.2 <- ftable(arr.3, row.vars = c(3))
ftab.2
##       Gender male             female            
##       Level   low middle high    low middle high
## Grade                                           
## S              11     10   12      9     16    8
## A               7     15   10     19     15    7
## B              11     10   12      9     16    8
## C               7     15   10     19     15    7
# row.vars = c()에 문자형 벡터를 지정하는 경우입니다.
ftab.3 <- ftable(arr.3, row.vars = c("Gender", "Grade")) 
ftab.3
##              Level low middle high
## Gender Grade                      
## male   S            11     10   12
##        A             7     15   10
##        B            11     10   12
##        C             7     15   10
## female S             9     16    8
##        A            19     15    7
##        B             9     16    8
##        C            19     15    7
ftab.4 <- ftable(arr.3, row.vars = "Grade")
ftab.4
##       Gender male             female            
##       Level   low middle high    low middle high
## Grade                                           
## S              11     10   12      9     16    8
## A               7     15   10     19     15    7
## B              11     10   12      9     16    8
## C               7     15   10     19     15    7

다차원 배열을 큰 표로 만들고 나니 배열로 출력될 때 보다 전체 데이터에 대한 이해가 더 좋아짐을 알 수 있습니다.

8.3.3 배열의 요약 정보

행렬에서 배운 apply() 함수를 이용하면 배열의 요약정보를 산출할 수 있습니다.

# MARGIN 인수에 원하는 출력하고자 하는 차원의 번호를 정수형 벡터로 입력합니다.
apply(arr.3, MARGIN = 1, FUN = mean)        # MARGIN = 1, 1번째 차원 즉 Gender를 기준으로 평균을 구합니다.
##     male   female 
## 10.83333 12.33333
apply(arr.3, MARGIN = c(1, 2), FUN = mean)  # 1번째, 2번째 차원을 기준으로 평균을 구합니다. 
##         Level
## Gender   low middle high
##   male     9   12.5 11.0
##   female  14   15.5  7.5
# MARGIN 인수에 원하는 출력하고자 하는 차원의 이름을 문자형 벡터로 입력합니다.
apply(arr.3, MARGIN = "Gender", FUN = mean)              # Gender를 기준으로 평균을 구합니다.
##     male   female 
## 10.83333 12.33333
apply(arr.3, MARGIN = c("Gender", "Level"), FUN = mean)  # Gender차원과 Level 차원을 기준으로 평균(행렬)을 구합니다. 
##         Level
## Gender   low middle high
##   male     9   12.5 11.0
##   female  14   15.5  7.5

8.3.4 배열을 데이터 프레임으로 변환하기

한편 배열에 있는 개별적인 요소의 값을 중심으로 각 차원을 컬럼으로 하는 데이터 프레임으로도 변환할 수 있습니다.10

배열을 데이터 프레임으로 변경하기 위해서는 as.data.fram() 함수를 이용합니다.

as.data.frame.table() 함수의 형식은 다음과 같습니다.

as.data.frame.table(x, row.names = NULL, ..., responseName = "Freq", stringsAsFactors = TRUE, sep = "", base = list(LETTERS))

  • x : R의 객체

  • responseName: 테이블 항목의 열에 사용할 이름. 일반적으로 “count”를 사용합니다.

arr.3 배열을 데이터 프레임으로 변환해 보겠습니다. 이를 위해 먼저 arr.3 배열을 분석해 보겠습니다.

배열 arr.3는 다음과 같이 구성되어 있습니다.

3개의 차원Gender, Level, Grade 으로 구성되고, 이 차원들은 Gender의 경우 “male”과 “female,” Level의 경우 “low,” “middle,” “high” 그리고 Grade 차원의 경우는 “S” ,”A”, “B,” “C” 등의 값을 가집니다.이러한 차원의 이름은 데이터 프레임의 열 이름이 되고, 차원의 값들은 데이터 프레임의 행을 이루게 됩니다.

그리고 데이터 입니다. 이 데이터를 데이터 프레임을 변환하기 위해서는 이 데이터를 설명하기 위한 열 이름을 지정해야 하는데 이때 사용되는 인수가 responseName입니다. arr.3의 데이터는 각 차원에 대한 빈도수로 본다면 responseName = “count”라고 설정하면 되겠습니다.

그러면 이제 arr.3 배열을 데이터 프레임을 변환하는 스크립트를 생성하여 확인해 보겠습니다.

df.arr.3 <- as.data.frame.table(arr.3, responseName = "count")
df.arr.3                  # arr.3의 요소의 갯수 24 만큼의 행으로 구성된 데이터 프레임입니다.
##    Gender  Level Grade count
## 1    male    low     S    11
## 2  female    low     S     9
## 3    male middle     S    10
## 4  female middle     S    16
## 5    male   high     S    12
## 6  female   high     S     8
## 7    male    low     A     7
## 8  female    low     A    19
## 9    male middle     A    15
## 10 female middle     A    15
## 11   male   high     A    10
## 12 female   high     A     7
## 13   male    low     B    11
## 14 female    low     B     9
## 15   male middle     B    10
## 16 female middle     B    16
## 17   male   high     B    12
## 18 female   high     B     8
## 19   male    low     C     7
## 20 female    low     C    19
## 21   male middle     C    15
## 22 female middle     C    15
## 23   male   high     C    10
## 24 female   high     C     7
str(df.arr.3)             # df.arr.3 데이터 프레임의 구조를 확인합니다.
## 'data.frame':    24 obs. of  4 variables:
##  $ Gender: Factor w/ 2 levels "male","female": 1 2 1 2 1 2 1 2 1 2 ...
##  $ Level : Factor w/ 3 levels "low","middle",..: 1 1 2 2 3 3 1 1 2 2 ...
##  $ Grade : Factor w/ 4 levels "S","A","B","C": 1 1 1 1 1 1 2 2 2 2 ...
##  $ count : int  11 9 10 16 12 8 7 19 15 15 ...

이제 arr.3 배열과 df.arr.3을 비교해 보기 바랍니다. 이렇듯 다차원 배열을 데이터 프레임 형태로 변환시키면 다양한 데이터 분석과 시각화를 수행할 수 있게 됩니다.

참고문헌

참고자료 : 다차원 배열 : 변환하고 요약하기


  1. 데이터 프레임에 대에서는 제2부의 제7장에서 학습하겠습니다.↩︎