8.3 다차원 배열의 변환과 요약
다차원 배열은 차원의 수가 늘어날 수록 배열을 적절하게 처리하는 것이 어려워 집니다. 이러한 문제를 해결하기 위한 방법에 대하여 살펴 보겠습니다.
첫 번째 방법은 자료를 원하는 형식으로 변형하는 것입니다. 이를 위한 방법이 배열의 차원을 재배열하는 것입니다.
두 번째 방법은 자료를 요약하여 차원의 수를 줄이는 것입니다. 이를 위해 배열을 큰 표로 만들고 차원을 줄이는 방법입니다.
세 번째 방법은 요약정보를 산출하는 것입니다.
세 번째 방법은 배열을 데이터 프레임 표로 변환하는 것입니다.
다음에서 이러한 방법에 대하여 학습하겠습니다.
8.3.1 차원의 순서 바꾸기 (재배열)
앞의 arr.3
배열을 예로 설명하겠습니다. 이 배열을 출력해 보면 세 번째 차원인 “Grade
” 등급별로 첫 번째 차원은 “Gender
” 차원과 두 번째 차원인 “Level
” 차원이 비교하는 행렬이 출력되고 있습니다.
그런데 이를 “Gender
”별로 “Grade
” 차원과 “Level
” 차원을 비교하는 결과로 출력하고 싶다고 가정해 보지요. 즉 원래 arr.3
배열의 첫 번째 차원과 세 번째 차원을 바꿔서 재배열을 하고자 하는 것입니다.
이러한 배열의 차원을 재배열하는데 사용하는 함수가 aperm()
함수입니다.
aperm() 함수의 형식은 다음과 같습니다.
aperm(a, perm, ...)
a
: 전환하고자 하는 배열perm
: 첨자 순열 벡터입니다. 일반적으로 정수1:n
의 순열입니다. 여기서n
은a
의 차원 수 입니다.
앞의 arr.3
배열의 예를 aperm()
함수를 이용하여 구현해 보겠습니다.
.3 # 1차원과 2차원의 행렬을 3차원 별로 출력합니다. arr
## , , 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)
.4 <- aperm(arr.3, perm = c(3, 2, 1)) # 차원의 배열을 3차원, 2차원, 1차원 순으로 재별합니다.
arr.4 # 이제 Grade와 Level로 구성된 기본 행렬이 Gender 별로 출력됩니다. arr
## , , 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별로 출력하는 형태가 될 것입니다.
.5 <- aperm(arr.3, perm = c(1, 3, 2))
arr.5 arr
## , , 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)과 정수형 벡터를 지정하는 경우입니다.
.3 arr
## , , 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
.1 <- ftable(arr.3, row.vars = c(1, 3)) # 1번째, 3번째 차원을 큰 표의 행에 함께 나열합니다.
ftab.1 # Gender, Grade 가 표의 행에, 열에는 Level이 표시가 됩니다. ftab
## 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번째 차원만 표현해 보겠습니다.
.2 <- ftable(arr.3, row.vars = c(3))
ftab.2 ftab
## 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()에 문자형 벡터를 지정하는 경우입니다.
.3 <- ftable(arr.3, row.vars = c("Gender", "Grade"))
ftab.3 ftab
## 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
.4 <- ftable(arr.3, row.vars = "Grade")
ftab.4 ftab
## 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
배열을 데이터 프레임을 변환하는 스크립트를 생성하여 확인해 보겠습니다.
.3 <- as.data.frame.table(arr.3, responseName = "count")
df.arr.3 # arr.3의 요소의 갯수 24 만큼의 행으로 구성된 데이터 프레임입니다. df.arr
## 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
을 비교해 보기 바랍니다. 이렇듯 다차원 배열을 데이터 프레임 형태로 변환시키면 다양한 데이터 분석과 시각화를 수행할 수 있게 됩니다.
참고문헌
참고자료 : 다차원 배열 : 변환하고 요약하기
데이터 프레임에 대에서는 제2부의 제7장에서 학습하겠습니다.↩︎