데이터 분석을 공부하고 있다면 어느정도 겪어봤을 문제인 변수 선택에 대한 내용입니다.
주로 상관계수를 구하기 위해서 데이터가 모두 수치형이여야 하는데 데이터 중 일부가 다른 유형이라서 에러가 뜨는 경우가 있을 겁니다.
또한, 작은 데이터 셋 같은 경우에는 일일이 지정해서 변수선택을 할 수 있겠지만 변수의 수가 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 |