[R] all_of와 any_of를 사용한 변수 선택 (조건을 이용한 선택 추가)

2023. 7. 29. 20:08·Data Science/Manipulation

데이터 분석을 공부하고 있다면 어느정도 겪어봤을 문제인 변수 선택에 대한 내용입니다.

주로 상관계수를 구하기 위해서 데이터가 모두 수치형이여야 하는데 데이터 중 일부가 다른 유형이라서 에러가 뜨는 경우가 있을 겁니다.

또한, 작은 데이터 셋 같은 경우에는 일일이 지정해서 변수선택을 할 수 있겠지만 변수의 수가 20개, 30개가 넘어가면 골치아픕니다.

이럴 때 복잡하게 코딩하지 않고 간단하게 원하는 데이터만 추출할 수 있습니다.

 

아래 코드와 같이 iris 데이터의 상관계수를 구하려고하면 에러가 발생합니다.

 

"cor(iris)에서 다음과 같은 에러가 발생했습니다:'x'는 반드시 수치형이어야 합니다"

 

cor(iris) # Error!

 

그 이유는 iris의 Species열이 수치형 자료가 아닌 문자형 자료가 입력되어 있기 때문이죠.

기본적으로 상관계수는 두 변수의 응집도를 확인하는데 문자형에서는 이를 처리할 수가 없습니다.

때문에 문자형 자료를 포함한 열을 제거한 후 수치형이 있는 데이터를 통해 상관계수를 구해야 합니다.

 

이를 위해서 all_of( ), any_of( ) 함수를 소개하고자 합니다. 

(* all_of( )와 any_of( )함수를 사용하기 위해 tidyselect 라이브러리나 tidyverse 라이브러리를 설치해야합니다)

 

  • all_of( )는 엄격한 (변수) 선택자입니다. 만약 변수명이 포함된 벡터가 포함되어 있지 않는다면 (missing) 오류를 발생합니다.
  • any_of( )는 변수가 포함되어 있는지를 확인하지 않습니다. 

 

아래 예시를 통해 자세하게 알아봅시다.

우선 상관계수를 구하기 위해서 수치형 자료를 포함한 변수명을 추출한 후 3가지 방식으로 원하는 수치형 변수만 선택할 수 있습니다.

idx <- map_lgl(iris, is.numeric)
var <- colnames(iris)[idx]

iris %>% select(var) %>% head()
iris %>% select(any_of(var)) %>% head()
iris %>% select(all_of(var)) %>% head()

 

반면에 수치형이 아닌 변수를 선택하기 위해서는 수치형이 아닌 변수명을 벡터로 모은다음 위와 같은 방식으로 선택하거나

수치형 변수가 포함된 벡터를 활용해 구할 수 있는데, select 문 안에서 -를 붙여주는 것으로 수행할 수 있습니다.

iris %>% select(-var) %>% head()
iris %>% select(-any_of(var)) %>% head()
iris %>% select(-all_of(var)) %>% head()

 

이제 데이터프레임에 없는 변수가 포함된 벡터에서 원하는 변수만 선택하는 방법에 대해서 알아보겠습니다.

var에는 iris 데이터 있는 Sepal.Length와 Sepal.Width 그리고 iris 데이터에는 존재하지 않는 Unkown_variable이 포함되어 있습니다.

이 경우 엄격한 선택자인 all_of를 사용했을때 오류가 나는 것을 볼 수 있으며,

변수명이 데이터에 포함되어 있는지 확인하는 any_of 함수를 사용했을때는 오류가 나지 않는 모습니다.

var <- c("Sepal.Length", "Sepal.Width", "Unknown_varibale")
iris %>% select(var)                     # Error!
iris %>% select(all_of(var)) %>% head()  # Error!
iris %>% select(any_of(var)) %>% head()

 

위와 마찬가지 방법으로 마이너스 연산자를 함수 앞에 쓴다면 해당 변수들을 뺀 결과를 얻을 수 있습니다.

이때도 데이터에 포함되지 않은 변수가 있어서 any_of 함수만 정상적으로 작동하네요

var <- c("Sepal.Length", "Sepal.Width", "Unknown_varibale")
iris %>% select(-var)
iris %>% select(-all_of(var)) %>% head()
iris %>% select(-any_of(var)) %>% head()

 

마지막으로 iris에서 수치형 변수를 선택하기 위해서 select 함수를 이용할 수 있지만 특정 조건이 만족되는 열을 선택하는 select_if 함수를 사용해서 원하는 조건의 열만 선택가능하다는 점 참고해주세요!

iris %>% select_if(.predicate = is.numeric) %>% head()
iris %>% select(1:4) %>% head()

 

+++ 추가 (8.31)

논리서술자 함수인 keep 함수와 discard 함수를 이용해서도 특정 조건(predicate)에 맞는 열들을 추출할 수 있습니다.

keep 함수는 predicate가 참인 요소를 남기며, discard 함수는 predicate가 거짓인 요소를 남깁니다.

iris %>% 
  keep(is.numeric) %>% 
  head(5)

iris %>% 
  discard(is.numeric) %>% 
  head(5)

저작자표시 비영리 변경금지 (새창열림)

'Data Science > Manipulation' 카테고리의 다른 글

[R] slice함수 : 위치를 이용한 행 선택 (Subset rows using position)  (2) 2023.09.06
[Data Science With R] 16. 리스트열(List-column)을 이용한 모델  (0) 2023.09.02
[Data Science With R] 15. Modelr을 활용한 모델 생성  (0) 2023.05.17
[Data Science With R] 14. 반복수행 with purrr  (0) 2023.04.18
[Data Science With R] 13. 함수형(Functional) with Base and purrr  (0) 2023.04.16
'Data Science/Manipulation' 카테고리의 다른 글
  • [R] slice함수 : 위치를 이용한 행 선택 (Subset rows using position)
  • [Data Science With R] 16. 리스트열(List-column)을 이용한 모델
  • [Data Science With R] 15. Modelr을 활용한 모델 생성
  • [Data Science With R] 14. 반복수행 with purrr
임파카
임파카
[ML & Statistics] 모바일 버전에서 수식 오류가 있어 PC 환경에서 접속하는 것을 권장합니다.
  • 임파카
    무기의 스탯(Stat)
    임파카
  • 전체
    오늘
    어제
    • Study (149)
      • Data Science (44)
        • Modeling (18)
        • Manipulation (21)
        • Visualization (4)
      • Statistics (59)
        • Mathmetical Statistics (53)
        • Categorical DA (1)
      • Web Programming (17)
      • AI (26)
        • Machine Learning (16)
        • Deep Learning (10)
      • 활동 및 프로젝트 (3)
  • 인기 글

  • hELLO· Designed By정상우.v4.10.5
임파카
[R] all_of와 any_of를 사용한 변수 선택 (조건을 이용한 선택 추가)
상단으로

티스토리툴바