7.5 행렬 요소에 접근하기

7.5.1 행과 열의 인덱싱에 의한 접근

대괄호 [ 인덱싱 방법을 사용하여 행렬의 요소에 액세스할 수 있습니다. 요소는var[row, column]으로 액세스 할 수 있습니다. 여기서rowcol은 벡터입니다. 이 때, 벡터 요소의 접근과 마찬가지로 rowcol을 각각 정수형 벡터, 문자형 벡터 그리고 논리형 벡터로 지정할 수도 있으며, 동시에 지정할 수도 있습니다.

마이너스 기호(-)를 사용하여 해당하는 행이나 열을 제외시킬 수도 있습니다.

rowcol 중 비어있으면 모든 것을 선택합니다. var[ 1, ]은 행렬 var1행, 전체 열을 선택하는 것이 됩니다. 다음의 예에서 살펴보도록 하겠습니다.

# 행렬 mat를 생성합니다.
mat <- rbind(c(1, 5, 3, 6),
             c(3, 6, 4, 8),
             c(2, 4, 8, 7))
mat
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    3    6
## [2,]    3    6    4    8
## [3,]    2    4    8    7
# 행과 열에 이름을 붙입니다.
rownames(mat) <- c("row.1", "row.2", "row.3")
colnames(mat) <- c("col.1", "col.2", "col.3", "col.4")
mat
##       col.1 col.2 col.3 col.4
## row.1     1     5     3     6
## row.2     3     6     4     8
## row.3     2     4     8     7
## row와 col을 정수형 벡터로 색인합니다.
mat[c(1,2),c(2,3)]             # 1 & 2행과 2 & 3열이 교차하는 요소를 출력합니다.
##       col.2 col.3
## row.1     5     3
## row.2     6     4
mat[c(3,2), ]                  # 3행과 2열의 순서로 전체 열의 요소를 출력합니다.
##       col.1 col.2 col.3 col.4
## row.3     2     4     8     7
## row.2     3     6     4     8
mat[,]                         # mat와 같습니다.
##       col.1 col.2 col.3 col.4
## row.1     1     5     3     6
## row.2     3     6     4     8
## row.3     2     4     8     7
mat[-1,]                       # 1행을 제외한 요소를 출력합니다.
##       col.1 col.2 col.3 col.4
## row.2     3     6     4     8
## row.3     2     4     8     7
## row와 col을 문자형 벡터로 색인합니다. (행과 열에 이름이 붙여진 경우)
mat[c("row.1", "row.2"), c("col.2", "col.3")]
##       col.2 col.3
## row.1     5     3
## row.2     6     4
mat[c("row.3", "row.2"), ]
##       col.1 col.2 col.3 col.4
## row.3     2     4     8     7
## row.2     3     6     4     8
mat[-"row.1", ]                # 문자형 벡터에서 - 기호는 Error를 유발합니다.
## Error in -"row.1": 단항연산자에 유효한 인자가 아닙니다
## row와 col을 논리형 벡터로 색인합니다.
mat[c(T, T, F), c(F, T, T, F)]
##       col.2 col.3
## row.1     5     3
## row.2     6     4
mat[c(F, T, T), c(F, T, T)]    # row의 c("row.3", "row.2")와 같이 위치를 바꿀 수는 없습니다.
##       col.2 col.3
## row.2     6     4
## row.3     4     8
mat[c(T, T, T), c(T, T, T, T)]
##       col.1 col.2 col.3 col.4
## row.1     1     5     3     6
## row.2     3     6     4     8
## row.3     2     4     8     7
mat[c(F, T, T), ]
##       col.1 col.2 col.3 col.4
## row.2     3     6     4     8
## row.3     2     4     8     7

여기서 주목해야 할 점은 인덱싱 후 반환된 행렬이 단일 행 행렬 또는 단일 열 행렬이면 결과가 벡터로 제공된다는 것입니다. 이를 벡터 형태가 아닌 행렬 형태로 출력하고 싶으면 [ ] 안에 drop = FALSE 인수를 입력해 줍니다.

mat[1,]                          # 1행으로 된 단일 행렬이라 "벡터 형태"로 출력합니다.
## col.1 col.2 col.3 col.4 
##     1     5     3     6
mat[1, drop=FALSE]               # 1행으로 된 "단일 행렬 형태"로 출력합니다.
## [1] 1

7.5.2 벡터 형태의 접근

한편 행렬을 마치 하나의 벡터처럼 인덱싱할 수도 있습니다. 이 경우 행렬은 열 단위로 요소들을 결합하여 형성된 벡터와 같아 집니다.

mat                               # 행렬의 요소 값들을 확인합니다.
##       col.1 col.2 col.3 col.4
## row.1     1     5     3     6
## row.2     3     6     4     8
## row.3     2     4     8     7
mat[1:4]                          # 단일 벡터의 요소를 접근하듯이 인덱싱을 했습니다. 
## [1] 1 3 2 5
mat[c(2, 5, 8)]                   # 결과를 확인해 보기 바랍니다. 2번째, 5번째, 8번째 요소가 무엇일까요?
## [1] 3 6 4
mat[c(TRUE, FALSE)]               # 이 경우 논리형 벡터로 인덱싱을 했습니다. 그러면 2개의 요소가 자동반복됩니다.
## [1] 1 2 6 3 8 8

즉 위의 mat 행렬은 (1 3 2 5 6 4 3 4 8 6 8 7)와 같이 열 우선으로 결합된 벡터와 같이 작동하는 것을 알 수 있습니다.

7.5.3 행과 열에 조건식을 입력하여 접근하기

다음과 같이 rowcol에 행렬의 요소에 대한 필터링 조건을 입력하여 접근할 수도 있습니다.

mat[mat > 5]                # 행렬의 요소 값이 5보다 큰 요소만 출력합니다.
## [1] 6 8 6 8 7
mat[mat %% 2 == 0]          # 행렬의 요소 값이 짝수인 요소만 출력합니다.
## [1] 2 6 4 4 8 6 8
mat[mat[, "col.2"] > 5, ]   ## col.2 열의 값이 5보다 큰 행만 출력합니다.
## col.1 col.2 col.3 col.4 
##     3     6     4     8

특히 mat[, "col.2"] > 5 식은 matcol.2 요소의 값이 5보다 큰지를 테스트합니다. 이 결과는 (FALSE TRUE TRUE)가 됩니다. 즉, col.2 의 첫 번째 요소는 5보다 크지 않으며, 2 번째와 3 번째 요소는 5보다 큰 것을 알 수 있습니다.

이제 이 결과를 mat[c(F, T, T), ]와 같이 행의 접근을 위한 논리형 벡터로 입력해 주면 우리가 원하는 결과가 출력이 되는 것입니다.

  • mat[ , “col.2”] > 5 : col.2 열의 요소들을 5보다 큰지 비교합니다. 1번째 (행) 요소와 2번째 (행) 요소가 해당됩니다.
  • mat[mat[, "col.2"] > 5 , ] 식은 결국 mat[c(1, 2), ] 또는 mat[c(T, T, F), ]와 같은 식이 됩니다.