R프로그래밍

[R프로그래밍] 벡터 구조 Ⅲ(필터링, subset, which, ifelse 삼항연산, names)

응호 2020. 4. 16. 10:30

데이터 구조(벡터, 행렬, 리스트, 데이터프레임) 특집 - 벡터 세번째

 

 

 

< 필터링 >

필터링이란 특정한 '조건'을 만족하는 원소들을 추출하는 작업이다.

전처리에서 많이 사용하는데 보통 전처리에서는 패키지를 많이 사용하지만 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