R Language Definition - 행렬과 배열 인덱싱

R Language Definition - 행렬과 배열 인덱싱

이 문서는 R Language Definition의 행렬과 배열 인덱싱 절을 한국어로 옮긴 내용이에요. 다차원 구조를 부분집합하는 규칙과 drop = FALSE 같은 특별한 옵션까지 살펴볼게요.

출처: 문서

본문

3.4.2 행렬과 배열 인덱싱

다차원 구조를 부분집합하는 작업은 각 인덱스 변수에 대해 1차원 인덱싱과 같은 규칙을 따릅니다. 다만 names 대신 dimnames의 해당 구성 요소가 사용돼요.

하지만 몇 가지 특별한 규칙이 적용됩니다. 일반적으로 구조체는 자신의 차원 수에 해당하는 인덱스 개수로 접근합니다. 그런데 단일 인덱스 하나만 사용할 수도 있어요. 이 경우 dimdimnames 속성은 무시되고, 결과는 실질적으로 c(m)[i]와 같습니다. m[1]은 보통 m[1, ]이나 m[, 1]과는 아주 다르다는 점에 유의하세요.

정수 행렬을 인덱스로 사용할 수도 있습니다. 이 경우 행렬의 열 수가 구조체의 차원 수와 일치해야 하며, 결과는 행렬의 행 수를 길이로 하는 벡터가 됩니다. 다음 예시는 m[1, 1]m[2, 2] 요소를 한 번에 추출하는 방법을 보여줍니다.

> m <- matrix(1:4, 2)
> m
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> i <- matrix(c(1, 1, 2, 2), 2, byrow = TRUE)
> i
     [,1] [,2]
[1,]    1    1
[2,]    2    2
> m[i]
[1] 1 4

인덱싱 행렬에는 음수 인덱스를 사용할 수 없습니다. NA와 0 값은 허용됩니다. 0을 포함하는 인덱스 행렬의 행은 무시되는 반면, NA를 포함하는 행은 결과에 NA를 만듭니다.

단일 인덱스를 사용하는 경우와 행렬 인덱싱을 사용하는 경우 모두, names 속성이 존재하면 구조체가 1차원이었을 때처럼 그 속성을 사용합니다.

인덱싱 연산으로 인해 결과의 특정 차원 길이가 1이 되는 경우, 예를 들어 3차원 행렬에서 m[2, , ]처럼 단일 슬라이스를 선택하면 그에 해당하는 차원은 일반적으로 결과에서 제거됩니다. 만약 1차원 구조가 되면 벡터가 얻어져요. 이는 때로 바람직하지 않을 수 있는데, 인덱싱 연산에 'drop = FALSE'를 추가하면 이 동작을 끌 수 있습니다. 이것은 [ 함수에 추가로 주는 인자이며 인덱스 개수에는 포함되지 않는다는 점에 유의하세요. 따라서 행렬의 첫 번째 행을 1 x n 행렬로 선택하는 올바른 방법은 m[1, , drop = FALSE]입니다. 이 차원 제거(dropping) 기능을 끄는 것을 잊는 것은, 인덱스가 드물게 길이 1이 되는 일반 서브루틴에서 흔한 실패 원인이에요. 이 규칙은 1차원 배열에도 그대로 적용되며, 'drop = FALSE'를 사용하지 않으면 어떤 부분집합 작업이든 벡터 결과를 얻습니다.

벡터는 1차원 배열과 구별됩니다. 1차원 배열은 dimdimnames 속성(둘 다 길이 1)을 갖기 때문이에요. 1차원 배열은 부분집합 연산으로 쉽게 얻을 수는 없지만, 명시적으로 생성할 수 있으며 table 함수가 반환하기도 합니다. dimnames 리스트의 요소 자체에 이름을 붙일 수 있기 때문에 때로는 이것이 유용합니다. names 속성에서는 그렇게 할 수 없어요.

m[FALSE, ] 같은 일부 연산은 특정 차원의 길이가 0인 구조체를 만들어냅니다. R은 일반적으로 이런 구조체를 합리적으로 처리하려고 합니다.

더 알아보기 (Learn more)

출처: R Language Definition - 행렬과 배열 인덱싱