벡터에 의한 인덱싱
벡터에 의한 인덱싱
R에서는 벡터를 인덱스로 사용해서 강력한 작업을 할 수 있어요. 이 문서에서는 x[i]와 같은 인덱싱이 i의 타입에 따라 어떻게 달라지는지 설명할게요.
출처: 문서
본문
3.4.1 벡터에 의한 인덱싱
R은 벡터를 인덱스로 사용하는 강력한 구성들을 허용해요. 먼저 단순 벡터의 인덱싱부터 살펴볼게요. 간단하게 표현식이 x[i]라고 가정해요. 그러면 i의 타입에 따라 다음과 같은 가능성들이 있어요.
정수(Integer). i의 모든 요소는 같은 부호여야 해요. 양수라면 해당 인덱스 번호를 가진 x의 요소들이 선택돼요. i에 음수가 포함되어 있으면, 지정된 요소들을 제외한 모든 요소가 선택돼요. i가 양수이고 length(x)를 초과하면 해당 선택은 NA가 돼요. i의 범위를 벗어난 음수 값은 R 2.6.0 버전부터 S와 호환되게 조용히 무시돼요. 존재하지 않는 요소를 제외하는 것은 빈 연산(“no-op”)을 의미하기 때문이에요. 특별한 경우로 0 인덱스가 있는데, 이는 아무 효과도 없어요. x[0]은 빈 벡터가 되고, 양수 또는 음수 인덱스들 사이에 0을 포함하더라도 그 0들이 생략된 것과 같은 효과를 가져요.
기타 숫자(Other numeric). 정수가 아닌 값은 사용 전에 (0 방향으로 절사하여) 정수로 변환돼요.
논리(Logical). 인덱싱 i는 일반적으로 x와 길이가 같아야 해요. 더 짧다면, 기초 산술 연산에서 설명한 대로 요소들이 재활용돼요. 더 길다면, x가 개념적으로 NA들로 확장돼요. x에서 선택되는 값은 i가 TRUE인 위치의 값들이에요.
문자(Character). i의 문자열들은 x의 names 속성과 매칭되고, 그 결과 정수들이 사용돼요. [[와 $에서는 정확한 일치가 실패하면 부분 일치가 사용돼요. 따라서 x에 "aa"라는 이름의 컴포넌트가 없고 "aabb"가 접두사 "aa"를 가진 유일한 이름이라면, x$aa는 x$aabb에 매칭돼요. [[의 경우, 부분 일치는 exact 인자로 제어할 수 있어요. exact의 기본값은 NA인데, 이는 부분 일치가 허용되지만 발생 시 경고가 나와야 한다는 뜻이에요. exact를 TRUE로 설정하면 부분 일치가 발생하지 않고, FALSE로 설정하면 부분 일치가 허용되지만 경고를 내지 않아요. [는 항상 정확한 일치를 요구해요. 문자열 ""은 특별하게 취급되는데, '이름 없음'을 나타내며 어떤 요소에도 매칭되지 않아요(이름 없는 요소에도 매칭되지 않아요). 참고로 부분 일치는 추출할 때만 사용되고 대체할 때는 사용되지 않아요.
요인(Factor). 결과는 x[as.integer(i)]와 동일해요. 요인 수준(factor levels)은 절대 사용되지 않아요. 원한다면 x[as.character(i)] 또는 유사한 구성을 사용하면 돼요.
빈(Empty). 표현식 x[]는 x를 반환하지만, 결과에서 "관련 없는" 속성들은 제거해요. 오직 names와 다차원 배열에서 dim 및 dimnames 속성만 유지돼요.
NULL. 이는 integer(0)인 것처럼 취급돼요. 누락된(즉 NA) 값으로 인덱싱하면 NA 결과가 나와요. 이 규칙은 논리 인덱싱의 경우에도 적용돼요. 즉, i 안에서 NA 선택자를 가진 x의 요소들은 결과에 포함되지만, 그 값은 NA가 돼요. 그런데 NA에는 여러 모드가 있다는 점에 유의하세요. 리터럴 상수는 모드가 "logical"이지만, 다른 타입으로 자동 변환되는 경우가 많아요. 이로 인한 한 가지 효과는 x[NA]는 x와 길이가 같지만, x[c(1, NA)]는 길이가 2라는 거예요. 전자의 경우 논리 인덱스 규칙이 적용되고 후자의 경우 정수 인덱스 규칙이 적용되기 때문이에요. [로 인덱싱하면 names 속성에 대해서도 관련 부분 집합화가 수행돼요.