6.4 dplyr

dplyr는 데이터 조작에 사용하는 깔끔한 패키지이다. 이 패키지를 사용하면 행을 필터링하고, 변수를 선택하고, 콘텐츠를 변경하는 것이 훨씬 쉬워진다. dplyrmagrittr과 협력하여 데이터 조작을 위한 “문법”을 제공한다.

dplyrtidyverse에서 일반적으로 문법이라는 단어는 R에서 작업하는 독자적인 방식을 나타낸다. tidyverse 문법에서는 함수를 동사라고한다. 동사는 매우 설명적인 방식으로 작성되어 깔끔한 문법을 ​​사용할 때 작성 중인 코드가 매우 명확하게 분석 스토리를 전달한다.

예를 들어 다음과 같이 dplyrmagrittr을 사용하여 평균 사망률을 구하는 마지막 예를 코딩할 수 있다.

expectancy %>% filter(race == "All Races") %>%
               summarize(avg = mean(death_rate)) %>%
               mutate(avg = round(avg, 1))
## # A tibble: 1 x 1
##     avg
##   <dbl>
## 1 1470.

위의 코드에서 expectancy 데이터 프레임을 우리가 하는 일을 설명하는 동사 세트로 파이프한다. 우리는 필터링하고, 요약하고, 변형하고 있다. 이것은 우리가 하는 일을 설명하고 있다. 또한 파이프 라인의 어느 곳에서나 간단히 새 동사를 변경하거나 추가할 수 있으므로 이 파이프 라인을 쉽게 변경할 수도 있다.

위의 코드는 tibble로 반환되는 하나의 값을 출력한다.

## A tibble: 1 x 1
##
##   avg    <dbl>
##     1     1489.

동일한 분석을하고 싶지만 성별에 따른 평균 사망률도 확인하려면 파이프 라인에 group_by 동사를 추가하면 된다.

expectancy %>% filter(race == "All Races") %>%
               group_by(sex) %>%
               summarize(avg = mean(death_rate)) %>%
               mutate(avg = round(avg, 1))
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 3 x 2
##   sex          avg
##   <chr>      <dbl>
## 1 Both Sexes 1459 
## 2 Female     1288.
## 3 Male       1662

이번에는 남녀 모두에 대한 값, 남성에 대한 값, 여성에 대한 값 등 세 가지 값을 얻는다.

## A tibble: 3 x 2
##
##       sex       avg
##     <chr>     <dbl>
## 1 Both Sexes   1478.
## 2 Female       1305.
## 3 Male         1683.

6.4.1 SQL 유사 조인

inner_join, left_join 그리고 right_join 동사를 사용하여 두 개의 관련 데이터 세트를 함께 결합한다. 이러한 dplyr 동사는 비슷한 이름의 SQL 문인 INNER JOIN, LEFT JOIN 및 RIGHT JOIN과 대략 동일하다.

dplyr 조인을 설명하기 위해 데이터 프레임(아니, tibble!)에 더 나은 레이블이 필요하고, 더 나은 레이블이 포함된 tibble도 있다고 가정해 보자. 이제 다음과 같이 레이블 티블을 만들 수 있다.

labels <- tribble( 
              ~key, ~new_label,
              "Both Sexes", "All Genders",
              "Female", "Identifies Female",
              "Male", "Identifies Male"
)

이 코드를 실행하면 “labels”라는 새 tibble이 환경 창의 “Data” 아래에 나타난다. 보기에서 개체 이름을 클릭하기 만하면 이전에 데이터 프레임을 본 것과 동일한 방식으로 볼 수 있다. 이제 dplyrinner_join 동사를 사용하여 이러한 레이블을 파이프 라인에 쉽게 추가할 수 있다.

expectancy %>% filter(race == "All Races") %>%
               group_by(sex) %>%
               summarize(avg = mean(death_rate)) %>%
               inner_join(labels, by = c("sex" = "key")) %>%
               mutate(avg = round(avg, 1)) %>%
               select(gender = new_label, avg_death_rate = avg)

위의 코드에서 dplyrselect 동사를 사용하여 레이블을보 다 나은 방식으로 정렬하고 이름을 바꾼 것을 볼 수 있다. 결과는 그림 6.2에서 볼 수 있다.

[tibble에 적용된 성별 라벨기

그림 6.2: [tibble에 적용된 성별 라벨기

위의 코드를 실행하면 결과가 tibble로 반환되는 것을 알 수 있다. 콘솔에 결과를 표시하는 대신 할당 연산자 <- 를 사용하여 나중에 사용할 수 있도록 결과를 저장할 수도 있다.

avg_death_rates_by_gender <- expectancy %>%
                   filter(race == "All Races") %>%
                   group_by(sex) %>%
                   summarize(avg = mean(death_rate)) %>%
                   inner_join(labels, by = c("sex" = "key")) %>%
                   mutate(avg = round(avg, 1)) %>%
                   select(gender = new_label, avg_death_rate = avg)
## `summarise()` ungrouping output (override with `.groups` argument)