6.4 dplyr
dplyr
는 데이터 조작에 사용하는 깔끔한 패키지이다. 이 패키지를 사용하면 행을 필터링하고, 변수를 선택하고, 콘텐츠를 변경하는 것이 훨씬 쉬워진다. dplyr
는 magrittr
과 협력하여 데이터 조작을 위한 “문법”을 제공한다.
dplyr
과 tidyverse
에서 일반적으로 문법이라는 단어는 R에서 작업하는 독자적인 방식을 나타낸다. tidyverse
문법에서는 함수를 동사라고한다. 동사는 매우 설명적인 방식으로 작성되어 깔끔한 문법을 사용할 때 작성 중인 코드가 매우 명확하게 분석 스토리를 전달한다.
예를 들어 다음과 같이 dplyr
과 magrittr
을 사용하여 평균 사망률을 구하는 마지막 예를 코딩할 수 있다.
%>% filter(race == "All Races") %>%
expectancy 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
동사를 추가하면 된다.
%>% filter(race == "All Races") %>%
expectancy 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도 있다고 가정해 보자. 이제 다음과 같이 레이블 티블을 만들 수 있다.
<- tribble(
labels ~key, ~new_label,
"Both Sexes", "All Genders",
"Female", "Identifies Female",
"Male", "Identifies Male"
)
이 코드를 실행하면 “labels”라는 새 tibble
이 환경 창의 “Data” 아래에 나타난다. 보기에서 개체 이름을 클릭하기 만하면 이전에 데이터 프레임을 본 것과 동일한 방식으로 볼 수 있다. 이제 dplyr
의 inner_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)
위의 코드에서 dplyr
의 select
동사를 사용하여 레이블을보 다 나은 방식으로 정렬하고 이름을 바꾼 것을 볼 수 있다. 결과는 그림 6.2에서 볼 수 있다.
위의 코드를 실행하면 결과가 tibble
로 반환되는 것을 알 수 있다. 콘솔에 결과를 표시하는 대신 할당 연산자 <-
를 사용하여 나중에 사용할 수 있도록 결과를 저장할 수도 있다.
<- expectancy %>%
avg_death_rates_by_gender 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)