7.5 행렬 요소에 접근하기
7.5.1 행과 열의 인덱싱에 의한 접근
대괄호 [
인덱싱 방법을 사용하여 행렬의 요소에 액세스할 수 있습니다. 요소는var[row, column]
으로 액세스 할 수 있습니다. 여기서row
와 col
은 벡터입니다. 이 때, 벡터 요소의 접근과 마찬가지로 row
와 col
을 각각 정수형 벡터, 문자형 벡터 그리고 논리형 벡터로 지정할 수도 있으며, 동시에 지정할 수도 있습니다.
마이너스 기호(-
)를 사용하여 해당하는 행이나 열을 제외시킬 수도 있습니다.
row
나 col
중 비어있으면 모든 것을 선택합니다. var[ 1, ]
은 행렬 var
의 1행, 전체 열을 선택하는 것이 됩니다. 다음의 예에서 살펴보도록 하겠습니다.
# 행렬 mat를 생성합니다.
<- rbind(c(1, 5, 3, 6),
mat 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을 정수형 벡터로 색인합니다.
c(1,2),c(2,3)] # 1 & 2행과 2 & 3열이 교차하는 요소를 출력합니다. mat[
## col.2 col.3
## row.1 5 3
## row.2 6 4
c(3,2), ] # 3행과 2열의 순서로 전체 열의 요소를 출력합니다. mat[
## 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
-1,] # 1행을 제외한 요소를 출력합니다. mat[
## col.1 col.2 col.3 col.4
## row.2 3 6 4 8
## row.3 2 4 8 7
## row와 col을 문자형 벡터로 색인합니다. (행과 열에 이름이 붙여진 경우)
c("row.1", "row.2"), c("col.2", "col.3")] mat[
## col.2 col.3
## row.1 5 3
## row.2 6 4
c("row.3", "row.2"), ] mat[
## col.1 col.2 col.3 col.4
## row.3 2 4 8 7
## row.2 3 6 4 8
-"row.1", ] # 문자형 벡터에서 - 기호는 Error를 유발합니다. mat[
## Error in -"row.1": 단항연산자에 유효한 인자가 아닙니다
## row와 col을 논리형 벡터로 색인합니다.
c(T, T, F), c(F, T, T, F)] mat[
## col.2 col.3
## row.1 5 3
## row.2 6 4
c(F, T, T), c(F, T, T)] # row의 c("row.3", "row.2")와 같이 위치를 바꿀 수는 없습니다. mat[
## col.2 col.3
## row.2 6 4
## row.3 4 8
c(T, T, T), c(T, T, T, T)] 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
c(F, T, T), ] mat[
## col.1 col.2 col.3 col.4
## row.2 3 6 4 8
## row.3 2 4 8 7
여기서 주목해야 할 점은 인덱싱 후 반환된 행렬이 단일 행 행렬 또는 단일 열 행렬이면 결과가 벡터로 제공된다는 것입니다. 이를 벡터 형태가 아닌 행렬 형태로 출력하고 싶으면 [ ]
안에 drop = FALSE
인수를 입력해 줍니다.
1,] # 1행으로 된 단일 행렬이라 "벡터 형태"로 출력합니다. mat[
## col.1 col.2 col.3 col.4
## 1 5 3 6
1, drop=FALSE] # 1행으로 된 "단일 행렬 형태"로 출력합니다. mat[
## [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
1:4] # 단일 벡터의 요소를 접근하듯이 인덱싱을 했습니다. mat[
## [1] 1 3 2 5
c(2, 5, 8)] # 결과를 확인해 보기 바랍니다. 2번째, 5번째, 8번째 요소가 무엇일까요? mat[
## [1] 3 6 4
c(TRUE, FALSE)] # 이 경우 논리형 벡터로 인덱싱을 했습니다. 그러면 2개의 요소가 자동반복됩니다. mat[
## [1] 1 2 6 3 8 8
즉 위의 mat 행렬은 (1 3 2 5 6 4 3 4 8 6 8 7)
와 같이 열 우선으로 결합된 벡터와 같이 작동하는 것을 알 수 있습니다.
7.5.3 행과 열에 조건식을 입력하여 접근하기
다음과 같이 row
와 col
에 행렬의 요소에 대한 필터링 조건을 입력하여 접근할 수도 있습니다.
> 5] # 행렬의 요소 값이 5보다 큰 요소만 출력합니다. mat[mat
## [1] 6 8 6 8 7
%% 2 == 0] # 행렬의 요소 값이 짝수인 요소만 출력합니다. mat[mat
## [1] 2 6 4 4 8 6 8
"col.2"] > 5, ] ## col.2 열의 값이 5보다 큰 행만 출력합니다. mat[mat[,
## col.1 col.2 col.3 col.4
## 3 6 4 8
특히 mat[, "col.2"] > 5
식은 mat
의 col.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), ]
와 같은 식이 됩니다.