[R프로그래밍] 벡터 구조 Ⅲ(필터링, subset, which, ifelse 삼항연산, names)
데이터 구조(벡터, 행렬, 리스트, 데이터프레임) 특집 - 벡터 세번째
< 필터링 >
필터링이란 특정한 '조건'을 만족하는 원소들을 추출하는 작업이다.
전처리에서 많이 사용하는데 보통 전처리에서는 패키지를 많이 사용하지만 R기본 내장함수들을 살펴보겠다.
크게 세 가지 방법이 있다.
1) 인덱싱 방법을 이용한 필터링
2) subset( ) 함수를 이용한 필터링
3) which( ) 함수를 이용한 필터링
첫 번째, ①인덱싱 [ ] 괄호를 통한 필터링
# 인덱싱 방법을 이용한 필터링
var <- c(1:100, 150:155)
var
var[var > 99]
인덱싱 방법을 이용한 필터링은 행렬(Matrix), 리스트(List), 데이터프레임(Data.frame)에도 똑같이 적용된다.
단, 인덱싱 방법을 이용한 필터링은 NA가 포함되어있다면 NA는 필터링하지 못하고 무조건 추출된다.
# NA가 포함된 벡터의 인덱싱
x <- c(1:8, NA, 9:10)
x
x[x>8]
두 번째, ② subset( )을 이용한 필터링 방식
인덱싱과 동일하게 조건을 주고 조건에 맞는 값만 필터링한다. 단, 인덱싱과 다르게 NA가 변수에 포함되어 있더라도 NA값을 추출하지 않는다는 차이점이 있다.
# subset 함수를 이용한 필터링
x <- c(1:100, NA, 150:155)
x[x>99]
subset(x, x>99)
세 번째, ③ which( ) 함수를 이용한 필터링
단, 이 함수는 해당 조건을 만족하는 원소들이 몇 번째 위치하는지 그 인덱스 번호만 추출한다.
# which를 이용한 필터링
x <- seq(100, 500, 100) # 100~500사이에 100간격으로 데이터 생성
x
which(x>250) # 250보다 큰 값이 몇 번째 위치에 있는지 출력
< 삼항연산 - ifelse함수 >
삼항연산자는 조건을 입력하고 조건이 참일 경우와 거짓일 경우 출력하는 값을 다르게 설정해줄 수 있는 기능이다.
ifelse(b, u, v) 형태이며, 논리형 벡터 b의 원소가 참일 경우 u의 원소를 거짓일 경우 v의 원소를 추출한다.
※ 논리 연산자
논리연산자의 결과값은 논리형 TRUE 또는 FALSE의 값으로만 반환된다.
논리연산자 | 의미 |
== | 좌변과 우변이 같은가? |
!= | 좌변과 우변이 다른가? |
> | 좌변이 우변보다 큰가? |
< | 좌변이 우변보다 작은가? |
>= | 좌변이 우변보다 크거나 같은가? |
<= | 좌변이 우변보다 작거나 같은가? |
# ifelse 함수
x <- 1:10
x
# x의 원소를 2로 나눈 나머지가 0이 맞으면 짝수, 틀리면 홀수
y <- ifelse(x%%2 == 0, "짝수", "홀수")
y
< 벡터 원소의 이름 names( ) >
names() 함수는 벡터의 원소들에 이름을 지정하는 함수이다.
이름이 지정된 벡터의 원소는 원소의 이름을 이용해 인덱싱 할 수 있게 된다.
벡터 원소의 이름에 NULL을 입력하면 이름을 삭제할 수 있다.
# names()
coffee <- c(4100, 4600, 5100)
names(coffee) # 이름이 없는 상태
names(coffee) <- c("tall", "grande", "venti")
names(coffee)
coffee
# 벡터 이름을 이용해 인덱싱
coffee["grande"]
coffee[2]
# 벡터 이름 삭제
names(coffee) <- NULL
names(coffee)
coffee