3.4 R 배열 Array

배열은 동일한 형태의 데이터가 2차원 이상으로 구성된 데이터 구조입니다. 벡터가 1차원이고, 행렬은 2차원, 배열은 2차원 이상의 구조입니다. 배열은 행렬을 층층히 쌓으면서 3차원, 4차원, 5차원 등으로 확대할 수 있습니다.

3.4.1 배열 생성

# 1~24의 숫자를 3x4 행렬의 2층 짜리 배열 만들기
arr1 <- array(1:24, dim = c(3, 4, 2))
arr1
#> , , 1
#> 
#>      [,1] [,2] [,3] [,4]
#> [1,]    1    4    7   10
#> [2,]    2    5    8   11
#> [3,]    3    6    9   12
#> 
#> , , 2
#> 
#>      [,1] [,2] [,3] [,4]
#> [1,]   13   16   19   22
#> [2,]   14   17   20   23
#> [3,]   15   18   21   24

3.4.2 배열 이름 붙이기

# array()의 dimnames 속성을 이용하여 이름 붙이기
arr2 <- array(
  data = 1:24,
  dim = c(4, 3, 2),
  dimnames = list(c("one", "two", "three", "four"),
                  c("ray", "karl", "mimo"),
                  c("steve", "mark")
                  )
  )
arr2
#> , , steve
#> 
#>       ray karl mimo
#> one     1    5    9
#> two     2    6   10
#> three   3    7   11
#> four    4    8   12
#> 
#> , , mark
#> 
#>       ray karl mimo
#> one    13   17   21
#> two    14   18   22
#> three  15   19   23
#> four   16   20   24

3.4.3 배열의 요소 추출

3.4.3.1 특정위치에 있는 요소 추출

# 2행, 2열, 2층 요소 추출
arr2[2, 2, 2]
#> [1] 18

# 각 층의 2행 추출
arr2[2, , ]
#>      steve mark
#> ray      2   14
#> karl     6   18
#> mimo    10   22

# 각층의 3행, 3열 요소 추출
arr2[3, 3, ]
#> steve  mark 
#>    11    23

# 2층의 행렬 추출
arr2[,,2]
#>       ray karl mimo
#> one    13   17   21
#> two    14   18   22
#> three  15   19   23
#> four   16   20   24

3.4.3.2 이름으로 요소 추출

# 2행(two), 2열(karl), 2층(mark) 요소 추출
arr2["two", "karl", "mark"]
#> [1] 18

# 각 층의 2행(two) 추출
arr2["two", , ]
#>      steve mark
#> ray      2   14
#> karl     6   18
#> mimo    10   22

# 각층의 3행(three), 3열(mimo) 요소 추출
arr2["three", "mimo", ]
#> steve  mark 
#>    11    23

# 2층(mark)의 행렬 추출
arr2[,,"mark"]
#>       ray karl mimo
#> one    13   17   21
#> two    14   18   22
#> three  15   19   23
#> four   16   20   24

3.4.3.3 마이너스 기호(-)를 이용하여 요소 제외

# 2행과 2열 제외
arr2[-2, -2, ]
#> , , steve
#> 
#>       ray mimo
#> one     1    9
#> three   3   11
#> four    4   12
#> 
#> , , mark
#> 
#>       ray mimo
#> one    13   21
#> three  15   23
#> four   16   24

3.4.3.4 조건으로 요소 추출

# 11초과인 값 추출
arr2[arr2 > 11]
#>  [1] 12 13 14 15 16 17 18 19 20 21 22 23 24

# 짝수 추출
arr2[arr2 %% 2 == 0]
#>  [1]  2  4  6  8 10 12 14 16 18 20 22 24

3.4.4 배열 요소 수정

arr2[2, 2, 1] <- 55
arr2
#> , , steve
#> 
#>       ray karl mimo
#> one     1    5    9
#> two     2   55   10
#> three   3    7   11
#> four    4    8   12
#> 
#> , , mark
#> 
#>       ray karl mimo
#> one    13   17   21
#> two    14   18   22
#> three  15   19   23
#> four   16   20   24

3.4.5 배열 연산

arr2 * 3
#> , , steve
#> 
#>       ray karl mimo
#> one     3   15   27
#> two     6  165   30
#> three   9   21   33
#> four   12   24   36
#> 
#> , , mark
#> 
#>       ray karl mimo
#> one    39   51   63
#> two    42   54   66
#> three  45   57   69
#> four   48   60   72
rowSums(arr2)
#>   one   two three  four 
#>    66   121    78    84
colSums(arr2)
#>      steve mark
#> ray     10   58
#> karl    75   74
#> mimo    42   90

배열의 차원이 같다면 배열끼리 계산이 가능합니다.

ax <- array(1:12, dim = c(2, 3, 2))
ay <- array(11:22, dim = c(2, 3, 2))
ax; ay
#> , , 1
#> 
#>      [,1] [,2] [,3]
#> [1,]    1    3    5
#> [2,]    2    4    6
#> 
#> , , 2
#> 
#>      [,1] [,2] [,3]
#> [1,]    7    9   11
#> [2,]    8   10   12
#> , , 1
#> 
#>      [,1] [,2] [,3]
#> [1,]   11   13   15
#> [2,]   12   14   16
#> 
#> , , 2
#> 
#>      [,1] [,2] [,3]
#> [1,]   17   19   21
#> [2,]   18   20   22

ax + ay
#> , , 1
#> 
#>      [,1] [,2] [,3]
#> [1,]   12   16   20
#> [2,]   14   18   22
#> 
#> , , 2
#> 
#>      [,1] [,2] [,3]
#> [1,]   24   28   32
#> [2,]   26   30   34
ax * ay
#> , , 1
#> 
#>      [,1] [,2] [,3]
#> [1,]   11   39   75
#> [2,]   24   56   96
#> 
#> , , 2
#> 
#>      [,1] [,2] [,3]
#> [1,]  119  171  231
#> [2,]  144  200  264
ax / ay
#> , , 1
#> 
#>        [,1]  [,2]  [,3]
#> [1,] 0.0909 0.231 0.333
#> [2,] 0.1667 0.286 0.375
#> 
#> , , 2
#> 
#>       [,1]  [,2]  [,3]
#> [1,] 0.412 0.474 0.524
#> [2,] 0.444 0.500 0.545
ax + (1:2)
#> , , 1
#> 
#>      [,1] [,2] [,3]
#> [1,]    2    4    6
#> [2,]    4    6    8
#> 
#> , , 2
#> 
#>      [,1] [,2] [,3]
#> [1,]    8   10   12
#> [2,]   10   12   14