우리는 정제 및 분석과정에서 데이터셋의 일부만 사용하고자 할 때가 있습니다. 이를 부분 선택(Subset)이라고 정의하는데 부분 선택하는 방법은 크게 인덱싱, 슬라이싱, 필터링으로 구분됩니다. 필터링(Filtering)의 경우 행 조건을 이용하여 부분 선택하는 방법을 의미합니다. 필터링은 인덱싱과 마찬가지로 [], [[]], $ 키워드를 통해 처리할 수 있습니다.

 

13.1. 필터링의 기본 개념

더보기

(1) 필터링의 기본 원리

필터링은 원 데이터에서 조건을 통해 논리형 벡터를 만든뒤, 논리형 벡터 중 TRUE인 값만 인덱싱하는 과정을 의미합니다. 그렇기에 필터링은 논리형 인덱싱(Logical Indexing; Boolean Indexing)라고도 정의됩니다. 이러한 프로세스를 그림으로 보자면 다음과 같습니다.

출처 : https://bookdown.org/ndphillips/YaRrr/logical-indexing.html

 

(2) 필터링 프로세스

예를 들어 2, 4, 6, 8, 10의 원소를 가지는 vector_01 객체에서 6보다 작은 원소를 필터링하면 다음과 같습니다.

vector_01 <- c(2, 4, 6, 8, 10)
CON <- vector_01 <= 6
vector_01[CON]

이를 이해하기 쉽게 도식화하면, 원 데이터(vector_01)에서 조건을 부여하여 CON 객체를 생성하고, CON 객체 중 TRUE인 원소만 출력하는 것을 확인할 수 있습니다.

 

PLUS) 조건 부여에 대한 논의

조건을 부여할 때 비교 연산은 >, >=, <, <=, ==, !=을 통해 연산할 수 있습니다. 또한 조건을 결합하고자 하는 경우 or 연산은 |, and 연산은 &를 통해 조건을 부여할 수 있습니다. 자세한 내용은 <14. 산술, 비교, 논리, 특수 연산자 알아보기 >을 참고하세요. 이를 통해 여러 조건을 만들면 다음과 같습니다.

vector <= 6               #CON01. 원소가 6보다 작은 조건 
!vector == 6              #CON02. 원소가 6이 아닌 조건
vector == 8 & vector == 4 #CON03. 원소가 8 그리고(and) 4인 조건
vector <= 2 | vector >= 8 #CON04. 원소가 2보다 작거나(or) 8보다 큰 조건

 

13.1. 벡터 인덱스, 원소 필터링

더보기

(1) []을 이용한 원소 필터링

1, 3, 5, 7, 9 원소를 가지는 vector_02 객체에서 5 이상의 원소를 필터링할 때 인덱싱을 이용하면 다음과 같습니다.

vector_02 <- c(1, 3, 5, 7, 9) ; vector_02
CON <- vector_02 >= 5 ; CON
vector_02[CON]

 

(3) 조건에 따른 값(원소) 반환 함수, subset()

인덱싱 문법을 사용하지 않고 subset() 함수를 이용하여 필터링을 할 수 있는데, 예시를 재현하면 다음과 같습니다.

subset(x=vector_02, subset=CON)

 

(4) 조건에 따른 인덱스 반환 함수, which()

which() 함수는 조건에 따라 인덱스를 반환하고자할 때 사용합니다. 위의 예시를 재현하면 다음과 같습니다.

which(x=CON)

 

13.2. 행렬 인덱스, 행 필터링

더보기

(1) [] 문법을 이용한 행 필터링

행렬에서 조건을 설정할 땐 ,을 이용하여 특정 열을 구분해야합니다. 예를 들어 1부터 9까지 원소를 가지는 matrix_01 객체에서 1번째 열의 값이 4보다 작은 경우를 필터링하고자 할 경우 다음과 같습니다.

matrix_01 <- matrix(data=c(1, 2, 3, 4, 5, 6, 7, 8, 9),
                    nrow=3,
                    byrow=TRUE) ; matrix_01
CON <- matrix_01[, 1] <= 4 ; CON
matrix_01[CON, ]

 

(2) subset() 함수를 이용한 행 필터링

subset() 함수를 통해 위의 예시를 재현할 수 있습니다.

subset(x=matrix_01, subset=CON)

 

(3) which() 함수를 이용한 행 인덱스 필터링

which() 함수를 통해 조건을 충족하는 행의 인덱스를 반환할 수 있습니다. 위의 동일한 예를 사용하면 다음과 같습니다.

which(x=CON)

 

13.3. 데이터프레임 인덱스, 행 필터링

더보기

(1) [] 문법을 이용한 행 필터링

데이터프레임 필터링도 ,을 이용하여 시행할 수 있습니다. <10. 데이터 구조 파악하기>student_df 객체를 재현하고, 그 중 gender열이 f인 값을 필터링하면 다음과 같습니다.

student_df <- data.frame(
  name      = c("PSH", "CGE", "CSH", "CMJ", "CJH"),
  gender    = factor(c("m", "f", "m", "f", "m")),
  korean    = c(35, 92.5, 70,85, 60),
  math      = c(65L, 80L, 88L, 67L, 28L),
  test_pass = c(FALSE, TRUE, TRUE, TRUE, FALSE)
) ; student_df
CON <- student_df[, "gender"] == "f" ; CON
student_df[CON, ]

 

(2) subset() 함수를 이용한 행 필터링

subset() 함수는 데이터프레임 구조에서도 적용 가능합니다. 예를 들면 다음과 같습니다. 

subset(x=student_df, subset=CON)

 

(3) which() 함수를 이용한 행 인덱스 필터링

which() 함수를 통해 조건을 충족하는 인덱스를 반환할 수 있습니다. 위의 동일한 예를 사용하면 다음과 같습니다.

which(x=CON)