데이터 분석/R 데이터 처리 & 분석

[R데이터분석] R which 함수 파헤치기

love R 2020. 7. 15. 01:25
반응형

R에서 which함수는 데이터의 인덱스를 반환하는 기능을 합니다. which함수는 다음과 같은 형태로 쓸 수 있습니다. 

인자로 논리형 벡터(TRUE 또는 FALSE로 구성된 벡터)를 주고 TRUE인 데이터에 대해 인덱스를 결과값으로 반환합니다. 

 

 

 

 

 

예1) which 함수는 아래 그림과 같이 TRUE인 데이터에 대한 순서 번호를 반환합니다. 

> test <- c(TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE)
> test
[1]  TRUE TRUE FALSE FALSE TRUE TRUE FALSE

# TRUE가 있는 순서를 반환
> which(test)
[1]  1 2 5 6

 

 

 

 

예2)

어떤 데이터를 2로 나누었을 때 짝수이면 TRUE, 홀수이면 FALSE를 반환하는 논리형태의 벡터를 구성해봅시다. 아래 예제는 1부터 10까지 2로 나누었을 때의 논리형태의 벡터를 구성하는 것입니다. 짝수가 TRUE 형태로 반환되기 위해서는 2로 나누었을 때 나머지가 0이어야 합니다. R에서 나머지를 구하는 연산자는 %%를 씁니다. 

 

 

# 1부터 10까지 수를 2로 나누었을 때 나머지가 0이 되도록 함
# 짝수이면 TRUE, 홀수이면 FALSE 가 나옴

> 1:10 %% 2 ==0
[1] FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE

# 짝수인 순서 반환(두번째 네번째 여섯번째 여덟번째 열번째 자리에 짝수가 있음)
> which(1:10 %%2 ==0)

[1]  2 4 6 8 10

 

 

예3)

위 예제의 연장선상으로 다른 예제를 살펴보겠습니다.  

c(2, 12, 4, 5, 6, 7, -11) 로 구성된 숫자벡터에서 3보다 큰 수에 대한 인덱스를 반환해봅시다. 아래 그림은 데이터에 3보다 큰 값을 가지고 있는 값에 대해 인덱스를 반환하고 있습니다.

 

 

# 3보다 큰 값에 대한 인덱스 반환
> test3 <- c(2,12,4,1,5,7,-11)

> test3 > 3
[1]  FALSE TRUE TRUE FALSE TRUE TRUE FALSE

> which(test3>3)
[1]  2 3 5 6

 

즉, which함수란 조건을 만족하는 데이터가 있는 위치에 대한 정보를 나타냅니다. 값의 위치가 바뀌면 당연히 인덱스도 달라지며 which함수의 결과값도 달라집니다! 따라서 값의 순서가 어떻게 되어있는 지에 따라 which함수의 결과도 충분히 달라질 수 있다는 뜻입니다

 

 

 

예4)

iris 데이터에 which함수를 응용하여 Sepal.Length 변수가 7보다 큰 값을 추출하는 방법을 알아보도록 하겠습니다.

 

코드 구성원리는 아래 순서와 같습니다.

 

① Sepal.Length 보다 큰 행에 대해 논리형태의 벡터를 구성

② 전 단계에서 구성한 논리형태의 벡터를 which 함수에 적용하여 인덱스를 반환

③ 인덱스를 이용하여 행을 추출 

 

# ① Sepal.Length 보다 큰 행에 대한 논리형태의 벡터 구성
> iris$Sepal.Length > 7 
[1] FALSE FALSE FALSE FALSE ...이하 생략

# ② 1번에서 구성한 논리벡터에서 TRUE가 위치해있는 순서를 반환
> which_test <- which(iris$Sepal.Length > 7)

> which_test
[1] 103 106 108 110 118 119 123 126 130 131 132 136

# ③ 2번에서 구성한 인덱스를 이용하여 iris데이터에서 조건을 만족하는 행을 추출
> iris[which_test,]

 

which함수는 TRUE인 값의 순서번호를 반환한다고 이해하면 쉽습니다. 위 예제에서 보듯 which함수를 응용하면 다양한 상황에서 유용하게 쓸 수 있으니 실습해보기 바랍니다.

반응형