13 tidyselect 열 선택
Tidyverse 메타패키지에 속하는 tidyr
, dplyr
, purrr
과 같은 패키지의 함수들을 모두 tidyselect
라는 열 선택 방법을 사용한다. 이것은 그 자체가 아주 작은 언어이기도 한데, 잘 사용하면 작업을 쉽게 할 수 있다. 특히 수십, 수백개의 열 이름을 가진 데이터를 처리할 때 이 방법이 아주 효과적이다.
- Selection language에 있는 내용을 바탕으로 정리했다.
penguins
데이터셋을 사용해서 열 선택 방법을 살펴보자.
head(penguins)
species island bill_len bill_dep flipper_len body_mass sex year
1 Adelie Torgersen 39.1 18.7 181 3750 male 2007
2 Adelie Torgersen 39.5 17.4 186 3800 female 2007
3 Adelie Torgersen 40.3 18.0 195 3250 female 2007
4 Adelie Torgersen NA NA NA NA <NA> 2007
5 Adelie Torgersen 36.7 19.3 193 3450 female 2007
6 Adelie Torgersen 39.3 20.6 190 3650 male 2007
-
변수1:변수10
형식으로 열 이름을 지정하면 데이터프레임에서변수1
열부터변수10
열까지의 열을 선택한다.
bill_len bill_dep flipper_len body_mass
1 39.1 18.7 181 3750
2 39.5 17.4 186 3800
3 40.3 18.0 195 3250
4 NA NA NA NA
5 36.7 19.3 193 3450
-
starts_with("변수")
형식으로 열 이름을 지정하면 데이터프레임에서변수
열이름으로 시작하는 열을 선택하고ends_with("변수")
형식으로 열 이름을 지정하면 데이터프레임에서변수
열이름으로 끝나는 열을 선택한다.
penguins |>
select(starts_with("bill")) |>
slice(1:5)
bill_len bill_dep
1 39.1 18.7
2 39.5 17.4
3 40.3 18.0
4 NA NA
5 36.7 19.3
bill_len flipper_len
1 39.1 181
2 39.5 186
3 40.3 195
4 NA NA
5 36.7 193
-
contains("문자열")
형식으로 열 이름을 지정하면 데이터프레임에서 이문자열
을 포함하는 열을 선택한다.
-
matches("정규표현식")
형식으로 열 이름을 지정하면 데이터프레임에서 이정규표현식
에 일치하는 열을 선택한다. 정규 표현식(regular expression)은 문자열을 표현하는 형식으로 문자열 패턴을 지정하는 일반적인 방법이다. 강력한데, 처음 배우는 사람들은 어려워하는 편이다. 예를 들어,a[a-z]{2}
는a
문자 뒤에 오는 두 개의 영문자가 따라 오는 경우를 말한다.
island body_mass
1 Torgersen 3750
2 Torgersen 3800
3 Torgersen 3250
4 Torgersen NA
5 Torgersen 3450
-
num_range("변수", 1:10)
형식으로 열 이름을 지정하면 데이터프레임에서변수1
,변수2
, …,변수10
열을 선택한다.tidyr
패키지에 들어 있는billoard
데이터셋을 예로 보자. 여기에서wk1
에서wk8
열을 선택해 보자.
head(billboard)
# A tibble: 6 × 79
artist track date.entered wk1 wk2 wk3 wk4 wk5 wk6 wk7 wk8
<chr> <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2 Pac Baby… 2000-02-26 87 82 72 77 87 94 99 NA
2 2Ge+her The … 2000-09-02 91 87 92 NA NA NA NA NA
3 3 Doors Do… Kryp… 2000-04-08 81 70 68 67 66 57 54 53
4 3 Doors Do… Loser 2000-10-21 76 76 72 69 67 65 55 59
5 504 Boyz Wobb… 2000-04-15 57 34 25 17 17 31 36 49
6 98^0 Give… 2000-08-19 51 39 34 26 26 19 2 2
# ℹ 68 more variables: wk9 <dbl>, wk10 <dbl>, wk11 <dbl>, wk12 <dbl>,
# wk13 <dbl>, wk14 <dbl>, wk15 <dbl>, wk16 <dbl>, wk17 <dbl>, wk18 <dbl>,
# wk19 <dbl>, wk20 <dbl>, wk21 <dbl>, wk22 <dbl>, wk23 <dbl>, wk24 <dbl>,
# wk25 <dbl>, wk26 <dbl>, wk27 <dbl>, wk28 <dbl>, wk29 <dbl>, wk30 <dbl>,
# wk31 <dbl>, wk32 <dbl>, wk33 <dbl>, wk34 <dbl>, wk35 <dbl>, wk36 <dbl>,
# wk37 <dbl>, wk38 <dbl>, wk39 <dbl>, wk40 <dbl>, wk41 <dbl>, wk42 <dbl>,
# wk43 <dbl>, wk44 <dbl>, wk45 <dbl>, wk46 <dbl>, wk47 <dbl>, wk48 <dbl>, …
# A tibble: 5 × 8
wk1 wk2 wk3 wk4 wk5 wk6 wk7 wk8
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 87 82 72 77 87 94 99 NA
2 91 87 92 NA NA NA NA NA
3 81 70 68 67 66 57 54 53
4 76 76 72 69 67 65 55 59
5 57 34 25 17 17 31 36 49
-
all_of(c("변수1", "변수2", "변수3"))
형식으로 열 이름을 지정하면 데이터프레임에서 이 열들을 선택한다. 지정한 열 이름이 모두 있어야 실행되고, 없으면 에러가 발생한다. 반면any_of(c("변수1", "변수2", "변수3"))
형식으로 열 이름을 지정하면 데이터프레임에서 이 열들을 선택한다. 있는 열들만 선택한다.
sel_vars <- c("bill_len", "bill_dep", "flipper_len")
penguins |>
select(all_of(sel_vars)) |>
slice(1:5)
bill_len bill_dep flipper_len
1 39.1 18.7 181
2 39.5 17.4 186
3 40.3 18.0 195
4 NA NA NA
5 36.7 19.3 193
sel_vars <- c("bill_len", "bill_depth", "flipper_len", "body_mass")
penguins |>
select(any_of(sel_vars)) |>
slice(1:5)
bill_len flipper_len body_mass
1 39.1 181 3750
2 39.5 186 3800
3 40.3 195 3250
4 NA NA NA
5 36.7 193 3450
-
everything()
형식으로 열 이름을 지정하면 데이터프레임에서 모든 열을 선택한다.
penguins |>
select(everything()) |>
slice(1:5)
species island bill_len bill_dep flipper_len body_mass sex year
1 Adelie Torgersen 39.1 18.7 181 3750 male 2007
2 Adelie Torgersen 39.5 17.4 186 3800 female 2007
3 Adelie Torgersen 40.3 18.0 195 3250 female 2007
4 Adelie Torgersen NA NA NA NA <NA> 2007
5 Adelie Torgersen 36.7 19.3 193 3450 female 2007
-
last_col()
형식으로 열 이름을 지정하면 데이터프레임에서 마지막 열을 선택한다.
-
where(fn)
형식으로 열 이름을 지정하면 데이터프레임의 열에 함수fn
을 적용한 결과가TRUE
인 열을 선택한다. 팩퍼(factor) 열인지 확인하는is.factor
, 숫자 열인지 확인하는is.numeric
등의 함수를 사용할 수 있다.
species island sex
1 Adelie Torgersen male
2 Adelie Torgersen female
3 Adelie Torgersen female
4 Adelie Torgersen <NA>
5 Adelie Torgersen female
bill_len bill_dep flipper_len body_mass year
1 39.1 18.7 181 3750 2007
2 39.5 17.4 186 3800 2007
3 40.3 18.0 195 3250 2007
4 NA NA NA NA 2007
5 36.7 19.3 193 3450 2007
이런 선택에서 연산자를 추가하여 사용할 수 있다.
-
!selection
은selection
에 해당하는 열을 제외한 나머지 열을 선택한다.!
에 마이너스-
기호를 사용할 수도 있다.
penguins |>
select(!starts_with("bill")) |>
slice(1:5)
species island flipper_len body_mass sex year
1 Adelie Torgersen 181 3750 male 2007
2 Adelie Torgersen 186 3800 female 2007
3 Adelie Torgersen 195 3250 female 2007
4 Adelie Torgersen NA NA <NA> 2007
5 Adelie Torgersen 193 3450 female 2007
penguins |>
select(-starts_with("bill")) |>
slice(1:5)
species island flipper_len body_mass sex year
1 Adelie Torgersen 181 3750 male 2007
2 Adelie Torgersen 186 3800 female 2007
3 Adelie Torgersen 195 3250 female 2007
4 Adelie Torgersen NA NA <NA> 2007
5 Adelie Torgersen 193 3450 female 2007
-
selection1 & selection2
는 AND 로직을selection
| selection2` OR 로직을 사용한다.
penguins |>
select(starts_with("bill") | ends_with("len")) |>
slice(1:5)
bill_len bill_dep flipper_len
1 39.1 18.7 181
2 39.5 17.4 186
3 40.3 18.0 195
4 NA NA NA
5 36.7 19.3 193
penguins |>
select(starts_with("bill") & ends_with("len")) |>
slice(1:5)
bill_len
1 39.1
2 39.5
3 40.3
4 NA
5 36.7