From 4a157c78feaa93f1e0b3d20a7f63f2fba50a6bda Mon Sep 17 00:00:00 2001 From: hadley Date: Wed, 30 Dec 2015 09:43:15 -0600 Subject: [PATCH] More writing about data transformation --- diagrams/transform-joins.png | Bin 0 -> 51171 bytes diagrams/transform.graffle | Bin 3010 -> 3347 bytes transform.Rmd | 172 ++++++++++++++++++++++------------- 3 files changed, 111 insertions(+), 61 deletions(-) create mode 100644 diagrams/transform-joins.png diff --git a/diagrams/transform-joins.png b/diagrams/transform-joins.png new file mode 100644 index 0000000000000000000000000000000000000000..023cd2f26aab5b5b5b1acdbe183a6ef39dc2b133 GIT binary patch literal 51171 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 literal 0 HcmV?d00001 diff --git a/diagrams/transform.graffle b/diagrams/transform.graffle index 492f836beb1cd96e2ef7bd6478dcb4194bba0cc7..0ba193755ed2dbd291628de307b0465a18ffd74c 100644 GIT binary patch literal 3347 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 E05Cn)kpKVy diff --git a/transform.Rmd b/transform.Rmd index b792972..409fea8 100644 --- a/transform.Rmd +++ b/transform.Rmd @@ -603,72 +603,66 @@ Most of the packages you'll learn through this book have been designed to work w ### Missing values -Back to making summaries: You use `summarise()` with __aggregate functions__, which take a vector of values and return a single number. +You may have wondered about the `na.rm` argument we used above. What happens if we don't set it? ```{r} flights %>% group_by(year, month, day) %>% - summarise(mean = mean(dep_delay), median = median(dep_delay)) + summarise(mean = mean(dep_delay)) ``` -Unfortunately this gives us a lot of missing vaules because aggregation functions generally obey the usual rules of missing values: if there's any missing value in the input, the output will be a missing value. Fortunately, all aggregation functions have an `na.rm` argument which removes the missing values prior to computation: +We get a lot of missing values! That's because aggregation functions obey the usual rule of missing values: if there's any missing value in the input, the output will be a missing value. Fortunately, all aggregation functions have an `na.rm` argument which removes the missing values prior to computation: ```{r} flights %>% group_by(year, month, day) %>% - summarise( - mean = mean(dep_delay, na.rm = TRUE), - median = median(dep_delay, na.rm = TRUE) - ) + summarise(mean = mean(dep_delay, na.rm = TRUE)) ``` In this case, where missing values represent cancelled flights, we could also tackle the problem by first removing the cancelled flights: ```{r} -not_cancelled <- filter(flights, !is.na(dep_time)) +not_cancelled <- filter(flights, !is.na(dep_delay), !is.na(arr_delay)) not_cancelled %>% group_by(year, month, day) %>% - summarise( - mean = mean(dep_delay), - median = median(dep_delay) - ) + summarise(mean = mean(dep_delay)) ``` ### Counts Whenever you do any aggregation, it's always a good idea to include either a count (`n()`), or a count of non-missing values (`sum(!is.na(x))`). That way you can check that you're not drawing conclusions based on very small amounts of data amount of non-missing data. -For example, let's look at the flights that have the highest average delays: +For example, let's look at the planes (identified by their tail number) that have the highest average delays: ```{r} -delays <- flights %>% - group_by(flight) %>% +delays <- not_cancelled %>% + group_by(tailnum) %>% summarise( - delay = mean(arr_delay, na.rm = TRUE) + delay = mean(arr_delay), n() ) ggplot(delays, aes(delay)) + geom_histogram(binwidth = 10) ``` -Wow, there are some flights with massive average delays. I sure wouldn't want to fly on one of those! +Wow, there are some planes that have an _average_ delay of 5 hours! -Actually, the story is a little more nuanced. If we also compute the number of non-missing delays for each flight and draw a scatterplot: +The story is actually a little more nuanced. We can get more insight if we draw a scatterplot of number of flights vs. average delay: ```{r} -delays <- flights %>% - group_by(flight) %>% +delays <- not_cancelled %>% + group_by(tailnum) %>% summarise( delay = mean(arr_delay, na.rm = TRUE), - n = sum(!is.na(arr_delay)) + n = n() ) ggplot(delays, aes(n, delay)) + geom_point() ``` -You'll see that most of the very delayed flight numbers happen very rarely. The shape of this plot is very characteristic: whenever you plot a mean (or many other summaries) vs number of observations, you'll see that the variation decreases as the sample size increases. +Not suprisingly, there is much more variation in the average delay when there are few flights. The shape of this plot is very characteristic: whenever you plot a mean (or many other summaries) vs number of observations, you'll see that the variation decreases as the sample size increases. When looking at this sort of plot, it's often useful to filter out the groups with the smallest numbers of observations, so you can see more of the pattern and less of the extreme variation in the smallest groups. This what the following code does, and also shows you a handy pattern for integrating ggplot2 into dplyr flows. It's a bit painful that you have to switch from `%>%` to `+`, but once you get the hang of it, it's quite convenient. @@ -690,9 +684,8 @@ There's another common variation of this type of pattern. Let's look at how the 1. As above, the variation in our aggregate decreases as we get more data points. -2. There's a correlation between skill and n. This is because baseball - teams controls who gets to try and hit the ball, and obviously they'll - pick their best players. +2. There's a positive correlation between skill and n. This is because teams + control who gets to play, and obviously they'll pick their best players. ```{r} batting <- tbl_df(Lahman::Batting) @@ -719,13 +712,26 @@ batters %>% arrange(desc(ba)) You can find a good explanation of this problem at and . -### Other aggregation functions. +### Other summary functions. -There are many other useful aggregations: +Just using means, counts, and sum can get you a long way, but R provides many other useful summary functions: * Measure of location: we've used `mean(x)`, but `median(x)` is also useful.The mean is the sum divided by the length; the median is a value where 50% of `x` is above, and 50% is below. + + It's sometimes useful to combine aggregation with logical subsetting: + + ```{r} + not_cancelled %>% + group_by(year, month, day) %>% + summarise( + avg_delay1 = mean(arr_delay), + avg_delay2 = mean(arr_delay[arr_delay > 0]) + ) + ``` + + mean(arr_delay[arr_delay > 0]) * Measure of spread: `sd(x)`, `IQR(x)`, `mad(x)`. The mean squared deviation, or standard deviation or sd for short, is the standard measure of spread. @@ -755,11 +761,27 @@ There are many other useful aggregations: * By position: `first(x)`, `nth(x, 2)`, `last(x)`. These work similarly to `x[1]`, `x[length(x)]`, and `x[n]` but let you set a default value if that position does not exist (i.e. you're trying to get the 3rd element from a - group that only has two elements). + group that only has two elements). -* Counts: `n()`. This takes no arguments, and refers to the current group size. - To count the number of non-missing values, use `sum(!is.na(x))`. To count - the number of distinct (unique) values, use `n_distinct(x)`. + These functions are complementary to filtering on ranks. Filtering gives + you all variables, which each observation in a separate row. Summarising + gives you one row per group, with multiple variables: + + ```{r} + not_cancelled %>% + group_by(year, month, day) %>% + mutate(r = rank(desc(dep_time))) %>% + filter(r %in% c(1, n())) + + not_cancelled %>% + group_by(year, month, day) %>% + summarise(first_dep = first(dep_time), last_dep = last(dep_time)) + ``` + +* Counts: You've seen `n()`, which takes no arguments, and returns the + size of the current group. To count the number of non-missing values, use + `sum(!is.na(x))`. To count the number of distinct (unique) values, use + `n_distinct(x)`. ```{r} # Which destinations have the most carriers? @@ -769,15 +791,15 @@ There are many other useful aggregations: arrange(desc(carriers)) ``` - Counts are so useful that dplyr provides a couple of helpers if all you - want is a count: + Counts are so useful that dplyr provides a helper if all you want is a + count: ```{r} not_cancelled %>% count(dest) ``` You can optionally provide a weight variable. For example, you could use - this to "count" the total number of miles a plane flew + this to "count" (sum) the total number of miles a plane flew: ```{r} not_cancelled %>% @@ -813,11 +835,11 @@ daily <- group_by(flights, year, month, day) (per_year <- summarise(per_month, flights = sum(flights))) ``` -However you need to be careful when progressively rolling up summaries like this: it's ok for sums and counts, but you need to think about weighting for means and variances, and it's not possible to do it exactly for medians. +Becareful when progressively rolling up summaries: it's ok for sums and counts, but you need to think about weighting for means and variances, and it's not possible to do it exactly for rank-based statistics like the median (i.e. the sum of groupwise sums is the overall sum, but the median of groupwise medians is not the overall median). ### Ungrouping -`ungroup()` +If you need to remove grouping, and return to operations on ungrouped data, use `ungroup()`. ### Exercises @@ -836,13 +858,16 @@ However you need to be careful when progressively rolling up summaries like this Which is more important: arrival delay or departure delay? +1. Look at the number of cancelled flights per day. Is there are pattern? + Is the proportion of cancelled flights related to the average delay? + 1. Which carrier has the worst delays? Challenge: can you disentangle the effects of bad airports vs. bad carriers? Why/why not? (Hint: think about `flights %>% group_by(carrier, dest) %>% summarise(n())`) ## Grouped mutates (and filters) -Grouping is definitely most useful in conjunction with `summarise()`, but you can also do convenient operations with `mutate()` and `filter()`: +Grouping is most useful in conjunction with `summarise()`, but you can also do convenient operations with `mutate()` and `filter()`: * Find the worst members of each group: @@ -868,9 +893,9 @@ Grouping is definitely most useful in conjunction with `summarise()`, but you ca mutate(prop_delay = arr_delay / sum(arr_delay)) ``` -A grouped filter is basically like a grouped mutate followed by an ungrouped filter. I generally avoid them except for quick and dirty manipulations. Otherwise it's too hard to check that you've done the manipulation correctly. +A grouped filter is a grouped mutate followed by an ungrouped filter. I generally avoid them except for quick and dirty manipulations: otherwise it's hard to check that you've done the manipulation correctly. -Functions that work most naturally in grouped mutates and filters are known as window functions (vs. aggregate or summary functions used in grouped summaries). You can learn more about useful window functions in the corresponding vignette: `vignette("window-functions")`. +Functions that work most naturally in grouped mutates and filters are known as window functions (vs. summary functions used for summaries). You can learn more about useful window functions in the corresponding vignette: `vignette("window-functions")`. ### Exercises @@ -891,14 +916,13 @@ Functions that work most naturally in grouped mutates and filters are known as It's rare that a data analysis involves only a single table of data. In practice, you'll normally have many tables that contribute to an analysis, and you need flexible tools to combine them. In dplyr, there are three families of verbs that work with two tables at a time: -* Mutating joins, which add new variables to one table from matching rows in - another. +* Mutating joins, which add new variables to one data frame from matching rows + in another. -* Filtering joins, which filter observations from one table based on whether or - not they match an observation in the other table. +* Filtering joins, which filter observations from one data frame based on + whether or not they match an observation in the other table. -* Set operations, which combine the observations in the data sets as if they - were set elements. +* Set operations, which treat observations like they were set elements. If you've used SQL before you're probably familiar with the mutating joins (these are the classic left join, right join, etc), but you might not know about the filtering joins (semi and anti joins) or the set operations. @@ -989,6 +1013,12 @@ There are four types of mutating join, which differ in their behaviour when a ma df1 %>% full_join(df2) ``` +Or visually: + +```{r, echo = FALSE} +knitr::include_graphics("diagrams/transform-joins.png") +``` + The left, right and full joins are collectively known as __outer joins__. When a row doesn't match in an outer join, the new variables are filled in with missing values. -------------------------------------------------------------------------------- @@ -999,7 +1029,7 @@ The left, right and full joins are collectively known as __outer joins__. When a #### New observations -While mutating joins are primarily used to add new variables, they can also generate new "observations". If a match is not unique, a join will add all possible combinations (the Cartesian product) of the matching observations: +Note that mutating joins are primarily used to add new variables, but they can also generate new "observations". If a match is not unique, a join will add all possible combinations (the Cartesian product) of the matching observations: ```{r} df1 <- data_frame(x = c(1, 1, 2), y = 1:3) @@ -1008,6 +1038,27 @@ df2 <- data_frame(x = c(1, 1, 2), z = c("a", "b", "a")) df1 %>% left_join(df2) ``` +#### Exercises + +1. Compute the average delay by destination, then join on the `airports` + data frame so you can show the spatial distribution of delays. + +1. What happened on June 13 2013? Display the spatial pattern of delays, + and then use google to cross-reference with the weather. + + ```{r, eval = FALSE, include = FALSE} + worst <- filter(not_cancelled, month == 6, day == 13) + worst %>% + group_by(dest) %>% + summarise(delay = mean(arr_delay), n = n()) %>% + filter(n > 5) %>% + inner_join(airports, by = c("dest" = "faa")) %>% + ggplot(aes(lon, lat)) + + borders("state") + + geom_point(aes(size = n, colour = delay)) + + coord_quickmap() + ``` + ### Filtering joins Filtering joins match obserations in the same way as mutating joins, but affect the observations, not the variables. There are two types: @@ -1015,7 +1066,17 @@ Filtering joins match obserations in the same way as mutating joins, but affect * `semi_join(x, y)` __keeps__ all observations in `x` that have a match in `y`. * `anti_join(x, y)` __drops__ all observations in `x` that have a match in `y`. -These are most useful for diagnosing join mismatches. For example, there are many flights in the nycflights13 dataset that don't have a matching tail number in the planes table: +Semi joins are useful when you've summarised and filtered, and then want to match back up to the original data. For example, say you only want to look at flights to the top 10 destinations: + +```{r} +top_dest <- flights %>% + count(dest, sort = TRUE) %>% + head(10) + +flights %>% semi_join(top_dest) +``` + +Anti joins are useful for diagnosing join mismatches. For example, there are many flights in the nycflights13 dataset that don't have a matching tail number in the planes table: ```{r} flights %>% @@ -1023,21 +1084,10 @@ flights %>% count(tailnum, sort = TRUE) ``` -(Can you spot the commonality amongst these tail numbers? What does a tailnum of `""` represent?) +#### Exercises -If you're worried about what observations your joins will match, start with a `semi_join()` or `anti_join()`. `semi_join()` and `anti_join()` never duplicate; they only ever remove observations. - -```{r} -df1 <- data_frame(x = c(1, 1, 3, 4), y = 1:4) -df2 <- data_frame(x = c(1, 1, 2), z = c("a", "b", "a")) - -# Four rows to start with: -df1 %>% nrow() -# And we get four rows after the join -df1 %>% inner_join(df2, by = "x") %>% nrow() -# But only two rows actually match -df1 %>% semi_join(df2, by = "x") %>% nrow() -``` +1. What does a tailnum of `""` represent? What do all tail numbers that don't + have matching records in `planes` have in common? ### Set operations