From fdd64081250c6d285725b39fca122f533b11897c Mon Sep 17 00:00:00 2001 From: hadley Date: Mon, 14 Dec 2015 09:45:41 -0600 Subject: [PATCH] Rewriting transforms --- diagrams/transform-logical.png | Bin 0 -> 71917 bytes diagrams/transform.graffle | Bin 0 -> 3010 bytes transform.Rmd | 487 +++++++++++++++++++-------------- 3 files changed, 288 insertions(+), 199 deletions(-) create mode 100644 diagrams/transform-logical.png create mode 100644 diagrams/transform.graffle diff --git a/diagrams/transform-logical.png b/diagrams/transform-logical.png new file mode 100644 index 0000000000000000000000000000000000000000..43462e6394b8bb292c7ccf6c38ce142ded767059 GIT binary patch literal 71917 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

R$pK>oPc`>hq+W|^XkifI{xtAMKcYA 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 literal 0 HcmV?d00001 diff --git a/diagrams/transform.graffle b/diagrams/transform.graffle new file mode 100644 index 0000000000000000000000000000000000000000..492f836beb1cd96e2ef7bd6478dcb4194bba0cc7 GIT binary patch literal 3010 zcmV;z3qAB7iwFP!000030PS7>Q`Nd-CUFCn=QMgya^!`dbIFJfNO`D z8$r~A z72)*UzU2(xt{-=IYWn&gn`;}tZy&U}pAOr~*tYyYIXvFl-)kxBwML^k9^0bP*zRsC zhx>b-t^zz7jrPZNW&I)u#;+TVtE;QJDXHo`cO(h@#-Znqg%{lH1G5?wsP}{ZI#d&J zPl*HH_N`v9x%S(}rMTH__5$mx*f(#4x99Z5^+rQ}3pXt%5JTZ@qK(Gva#jTDwt8j& zEKefN^FpTQneyVd4L|Up$(tZy-5ojB&~qo_`T<j)rF_>^`byCZ{q{B`t)y?+rk^j`acwKEGgD-5JEothlq9tqk#&L_Tf~$ziKCmq z(!GrDCT>Ufw>|SJ7AqF)<3Um!(C1tcv#a#0@mv|#o{XHPZ4I5AOgJx7NZlEmJzz1X_k?M0Qn0-6Vnzxdq$zKk zK~5Zkuv){UhM9udYs_CGr2G@XD<_>~;(FQgyJp`OH_EBiySy+**+ScvKeo-APS3P+ zHDkqcl(&j}%NA>2k6kb5T$p3w7dT$pUiKV+EP5c?JL!N4y9rf5RCTV5ne|D&dn0ow zj-Xtkz}z{=D}_ksAo7BwT_eHcqd5}!;#*A>8?7d(ZEHKU#tfv_j4cLNJ1vY1rt|jJ zc8yX}10`c@=wzq8Ly6HuMYXsSyB}#IU(u&_r=UpaJ%?s+vDkxzEk?o#Qcg72Zkj$_ zB2gd~(L$#beP|pS2r_2pRkdBa{sn4zDxss(t5fBLD$5wJ=ZWJ>_ z!R7!@WUW(cW17?u81+MKIr0=;H2{z(!WsP`CQjc-8z{=( z%v2Fb6j*VxxnsLmdD0`{hk1`2HHZ~sY zfqBjeT00w?UO)Ud`$~QYtl>o>Z!6m&1luVDq zKLyeXM(umrw;HzwY0|#6MEDrLAbiY!_tXYWS2yT_u*<{i6d(RRe|*?fingA=YhZm{n!uW~bX-kJ6j-Awu&x5@ z9}KKHDNW=;jh7g?6vdNe>J+`2?7ZB`4hF@uL@6=;)zz_Nrfk+ou|+63>#|>y&*M~Hu4g~EdiL{jpZzeFc`ixIWt`|GJ}oX9 z2}->7n;6wd@Zgc4Osh(X{t~^d2m(vhE4&(@U+_xwg5`>sX_@tk9w1l6~m$!t!vhN?Y@A59;C!_-37i^rWQRbgA zkSd-1f{n8%b6VorGGXC%pH9i_3ir;l`pE@M>5cU} z7w(lWNpc(HXVy+d)Q&m!yY33~={@S-O{~7~_ubxQysu(m;}X;-mT#Tsw_DFtBX8~= zn#05f>xKL0MLjP!OK*XV2EtomYx;i)G48tQP2UHm?Z>AVgoiOK-`ZU^eA!}{h_ZMq z_OKcS=gAMf)W({3E_*w%#MM&LMMeY?xRYS988sbil-QMj(So0Fe@$>7_k-nZCw35= zjzn0G2cDR=BgUo|Zv3AiPc6C%>FrR=wllPxyexe;$O+@f!vOYydS5uh#9s5W3dj_G zh@m5hcVtQ}Rbg2E9s&ke?$}z1KJ7pt;^iWb$UD#nbLfcRKJ-3#MCU??AY;sPOaI{Z zt-%$v5cXQti_c$(7>Rox!0^!x#Om!i@GRj3DGlF&3ekBOD>Ij1vjv@W>90U5 z{d2L`eC%wwLEw%)m|o&Uj^uW(Gu8v!HG{NIPp=tH`)`avQ4PDUXMJ-W(+0UMCu4Q_ zih6EeLUchzTg~8GfA_up=@cXJ?=AcD-mcqZe{TJ`*J)ogFAk28iqB8q+r426KKBof z@#l;4-4nYB_gihX+a>S6d_Mh%ntP}1X6Fmg>|EPdt#@~ezb^*CkElmN%3b^qVTkvV z=bIF<&#w%gAA*8mO2m!ycHafHNIN(Z@^l|jV4S}~M;yr&p--zaj5 z4vJbKa0&~{aoBWv;+|!X9qY?P#If`pjX(B9+X*c1F0G#w$8dROruCG#aXnQRF9|EqV)Ce~IDx@Z zlS@O(NG=PVnD!*sxeN%YGhRs0^F3AefSKeTWJR;q3Q E05Cn)kpKVy literal 0 HcmV?d00001 diff --git a/transform.Rmd b/transform.Rmd index c678699..01a125d 100644 --- a/transform.Rmd +++ b/transform.Rmd @@ -6,76 +6,255 @@ library(nycflights13) source("common.R") ``` +Visualisation is an important tool for insight generation, but it is rare that you get the data in exactly the right form you need for visualisation. Often you'll need to create some new variables or summaries, or maybe you just want to rename the variables or reorder the observations in order to make the data a little easier to work with. You'll learn how to do all that (and more!) in this chapter which will teach you how to transform your data using the dplyr package. + When working with data you must: -* Figure out what you want to do. +1. Figure out what you want to do. -* Describe those tasks in the form of a computer program. +1. Precisely describe what you want to do in such a way that the + compute can understand it (i.e. program it). -* Execute the program. +1. Execute the program. The dplyr package makes these steps fast and easy: -* By constraining your options, it simplifies how you can think about common data manipulation tasks. +* By constraining your options, it simplifies how you can think about + common data manipulation tasks. -* It provides simple "verbs", functions that correspond to the most common data manipulation tasks, to help you translate those thoughts into code. +* It provides simple "verbs", functions that correspond to the most + common data manipulation tasks, to help you translate those thoughts + into code. -* It uses efficient data storage backends, so you spend less time waiting for the computer. +* It uses efficient data storage backends, so you spend less time + waiting for the computer. -Dplyr aims to provide a function for each basic verb of data manipulation: - -* `filter()` (and `slice()`) -* `arrange()` -* `select()` (and `rename()`) -* `mutate()` (and `transmute()`) -* `summarise()` -* `group_by()` +In this chapter you'll learn the key verbs of dplyr in the context of a new dataset on flights departing New York City in 2013. ## Data: nycflights13 To explore the basic data manipulation verbs of dplyr, we'll start with the built in -`nycflights13` data frame. This dataset contains all `r nrow(nycflights13::flights)` flights that departed from New York City in 2013. The data comes from the US [Bureau of Transportation Statistics](http://www.transtats.bts.gov/DatabaseInfo.asp?DB_ID=120&Link=0), and is documented in `?nycflights13` +`nycflights13` data frame. This dataset contains all `r format(nrow(nycflights13::flights), big.mark = ",")` flights that departed from New York City in 2013. The data comes from the US [Bureau of Transportation Statistics](http://www.transtats.bts.gov/DatabaseInfo.asp?DB_ID=120&Link=0), and is documented in `?nycflights13`. ```{r} +library(dplyr) library(nycflights13) -dim(flights) -head(flights) +flights ``` -dplyr can work with data frames as is, but if you're dealing with large data, it's worthwhile to convert them to a `tbl_df`: this is a wrapper around a data frame that won't accidentally print a lot of data to the screen. +The first important thing to notice about this dataset is that it prints a little differently to most data frames: it only shows the first ten rows and all the columns that fit on one screen. If you want to see the whole dataset, use `View()` which will open the dataset in the RStudio viewer. +It also prints an abbreviated description of the column type: + +* int: integer +* dbl: double (real) +* chr: character +* lgl: logical +* date: dates +* time: times + +It prints differently because it has a different "class" to usual data frames: + +```{r} +class(flights) +``` + +This is called a `tbl_df` (prounced tibble diff) or a `data_frame` (pronunced "data underscore frame"; cf. `data dot frame`) + +You'll learn more about how that works in data structures. If you want to convert your own data frames to this special case, use `as.data_frame()`. I recommend it for large data frames as it makes interactive exploration much less painful. + +To create your own new tbl\_df from individual vectors, use `data_frame()`: + +```{r} +data_frame(x = 1:3, y = c("a", "b", "c")) +``` + +*** + +There are two other important differences between tbl_dfs and data.frames: + +* When you subset a tbl\_df with `[`, it always returns another tbl\_df. + Contrast this with a data frame: sometimes `[` returns a data frame and + sometimes it just returns a single column: + + ```{r} + df1 <- data.frame(x = 1:3, y = 3:1) + class(df1[, 1:2]) + class(df1[, 1]) + + df2 <- data_frame(x = 1:3, y = 3:1) + class(df2[, 1:2]) + class(df2[, 1]) + ``` + + To extract a single column use `[[` or `$`: + + ```{r} + class(df2[[1]]) + class(df2$x) + ``` + +* When you extract a variable with `$`, tbl\_dfs never do partial + matching. They'll throw an error if the column doesn't exist: + + ```{r, error = TRUE} + df <- data.frame(abc = 1) + df$a + + df2 <- data_frame(abc = 1) + df2$a + ``` + +*** + +## Single table verbs + +There are five key verbs: + +* `filter()` picks observations based on their values. + +* `arrange()` reorders observations. + +* `select()` picks variables based on their names. + +* `mutate()` allows you to add new variables that are functions of + existing variables. + +* `summarise()` reduces many values to a single value. + +These can all be used in conjunction with `group_by()` which changes the scope of each function from operating on the entire dataset to operating on it group-by-group. `group_by()` is most useful in conjunction with `summarise()`, but can also be useful with `mutate()`. + +All verbs work very similarly: + +1. The first argument is a data frame. + +1. The subsequent arguments describe what to do with the data frame. + Notice that you can refer to columns in the data frame directly without + using `$`. + +1. The result is a new data frame. + +Together these properties make it easy to chain together multiple simple steps to achieve a complex result. + +These five functions provide the basis of a language of data manipulation. At the most basic level, you can only alter a tidy data frame in five useful ways: you can reorder the rows (`arrange()`), pick observations and variables of interest (`filter()` and `select()`), add new variables that are functions of existing variables (`mutate()`), or collapse many values to a summary (`summarise()`). Each verb is described in turn in the sections below. + ## Filter rows with `filter()` -`filter()` allows you to select a subset of rows in a data frame. The first argument is the name of the data frame. The second and subsequent arguments are the expressions that filter the data frame: - -For example, we can select all flights on January 1st with: +`filter()` allows you to select a subset of rows in a data frame. The first argument is the name of the data frame. The second and subsequent arguments are the expressions that filter the data frame. For example, we can select all flights on January 1st with: ```{r} filter(flights, month == 1, day == 1) ``` +When you run this line of code, dplyr executes the filtering operation and returns the modified data frame. dplyr operators never modify their inputs, so if you want to save the results, you'll need to use the assignment operator `<-`: + +```{r} +jan1 <- filter(flights, month == 1, day == 1) +``` + +-------------------------------------------------------------------------------- + This is equivalent to the more verbose code in base R: ```{r, eval = FALSE} flights[flights$month == 1 & flights$day == 1, ] ``` -`filter()` works similarly to `subset()` except that you can give it any number of filtering conditions, which are joined together with `&` (not `&&` which is easy to do accidentally!). You can also use other boolean operators: +`filter()` works similarly to `subset()` except that you can give it any number of filtering conditions, which are joined together with `&`. + +-------------------------------------------------------------------------------- + +### Comparisons + +* Numeric values: `>`, `>=`, `<`, `<=`, `!=` (not equal), and `==`. + +* Strings: as well as `==` and `!=`, `%in%` is very useful. You'll learn about + regular expressions, a powerful tool for matching patterns in string in + strings. + +* Dates and times: you can use the same operators as numeric, or the special date + extractors you'll learn about in [dates and times] + +When you're starting out with R, the easiest mistake to make is to use `=` instead of `==` when testing for equality. When this happens you'll get a somewhat uninformative error: + +```{r, error = TRUE} +filter(flights, month = 1) +``` + +### Logical operators + +Multiple arguments to `filter()` are combined with "and". To get more complicated expressions, you can use boolean operators yourself: ```{r, eval = FALSE} filter(flights, month == 1 | month == 2) ``` -To select rows by position, use `slice()`: +The following figure shows the complete set of boolean operations for two sets. -```{r} -slice(flights, 1:10) +```{r bool-ops, echo = FALSE, fig.cap = "Complete set of boolean operations", out.width = "75%"} +knitr::include_graphics("diagrams/transform-logical.png") ``` +Sometimes you can simplify complicated subsetting by remembering De Morgan's law: `!(x & y)` is the same as `!x | !y`, and `!(x | y)` is the same as `!x & !y`. + +Note that R has both `&` and `|` and `&&` and `||`. `&` and `|` are vectorised: you give them two vectors of logical values and they return a vector of logical values. `&&` and `||` are scalar operators: you give them individual `TRUE`s or `FALSE`s. They're used if `if` statements when programming. You'll learn about that later on. + +Cumulative operations: `cumany()`, `cumall()`. + ### Missing values -* Why `NA == NA` is not `TRUE` -* Why default is `na.rm = FALSE`. +One important feature of R that can make comparison tricky is the missing value, `NA`. This represents an unknown value, so any operation involving an unknown value will also be unknown: + +```{r} +NA > 5 +10 == NA +NA + 10 +NA / 2 +``` + +The most confusing result is this one: + +```{r} +NA == NA +``` + +It's easiest to understand why this is true with a bit more context: + +```{r} +# Let x be Mary's age. We don't know how old she is. +x <- NA + +# Let y be John's age. We don't know how old he is. +y <- NA + +# Are John and Mary the same age? +x == y +# We don't know! +``` + +If you want to determine if a value is missing, use `is.na()`. (And RStudio will remind you of this by giving a code warning whenever you use `x == NA`) + +Note that `filter()` only includes rows where the condition is `TRUE`; it excludes both `FALSE` and `NA` values. If you want to preserve missing values, ask for them explicitly: + +```{r} +df <- data_frame(x = c(1, NA, 3)) +filter(df, x > 1) +filter(df, is.na(x) | x > 1) +``` + +### Exercises + +1. Find all the flights that: + + * Departed in summer. + * That flew to Houston (`IAH` or `HOU`). + * That were delayed by more two hours. + * That arrived more than two hours late, but didn't leave late. + * We delayed by at least an hour, but made up over 30 minutes in flight. + * Departed between midnight and 6am. + +1. How many flights have a missing `dep_time`? What other variables are + missing? What might these rows represent? ## Arrange rows with `arrange()` @@ -122,18 +301,25 @@ rename(flights, tail_num = tailnum) ## Add new variable with `mutate()` -Besides selecting sets of existing columns, it's often useful to add new columns that are functions of existing columns. This is the job of `mutate()`: +Besides selecting sets of existing columns, it's often useful to add new columns that are functions of existing columns. This is the job of `mutate()`: ```{r} -mutate(flights, +flights_sml <- select(flights, + year:day, + ends_with("delay"), + distance, + air_time +) +mutate(flights_sml, gain = arr_delay - dep_delay, - speed = distance / air_time * 60) + speed = distance / air_time * 60 +) ``` Note that you can refer to columns that you've just created: ```{r} -mutate(flights, +mutate(flights_sml, gain = arr_delay - dep_delay, gain_per_hour = gain / (air_time / 60) ) @@ -142,37 +328,66 @@ mutate(flights, If you only want to keep the new variables, use `transmute()`: ```{r} -transmute(flights, +transmute(flights_sml, gain = arr_delay - dep_delay, gain_per_hour = gain / (air_time / 60) ) ``` +### Useful functions + +You'll learn about useful functions for strings and dates in their respective chapters. For numbers: + +* Arithmetic operators: `+`, `-`, `*`, `/`, `^`. These are all vectorised, so + you can work with multiple columns. If you give it a single number it will + be expanded to match the length of the column. + +* Modulo arithmetic: `%%`, `%/%`. Modular arithmetic (division with reminder) + is a handy tool to have in your toolbox as it allows you to break integers + down into pieces. For example, in the flights dataset, you can compute + `hour` and `minute` from `dep_time` with: + + ```{r} + transmute(flights, + dep_time, + hour = dep_time %/% 100, + minute = dep_time %% 100 + ) + ``` + +* Logs: `log()`, `log2()`, `log10()`. All else being equal, I recommend + using `log2()` because it's easy to interpret: an difference of 1 mean + doubled, a difference of -1 means halved. `log10()` is similarly easy to + interpret, as long as your have a very wide range of numbers. + +* Cumulative calculations: `cumsum()`, `cumprod()`, `cummin()`, `cummax()`, + `cummean()`. + +* Parallel computations: `pmin()`, `pmax()`. Need `psum()` etc for + correct `na.rm = TRUE`. + +* Logical comparisons, which you learned about earlier. If you're doing + a complex sequence of logical operations it's often a good idea to + store the interim values in new variables so you can check that each + step is doing what you expect. + +* `lead()` and `lag()` give offsets. Most useful in conjunction with + `group_by()` which you'll learn about shortly. + +* Various types of ranking: `min_rank()`, `row_number()`, `dense_rank()`, + `cume_dist()`, `percent_rank()`, `ntile()`. + ## Summarise values with `summarise()` -The last verb is `summarise()`. It collapses a data frame to a single row (this is exactly equivalent to `plyr::summarise()`): +The last verb is `summarise()`. It collapses a data frame to a single row: ```{r} summarise(flights, - delay = mean(dep_delay, na.rm = TRUE)) + delay = mean(dep_delay, na.rm = TRUE) +) ``` -Below, we'll see how this verb can be very useful. - -## Commonalities - -You may have noticed that the syntax and function of all these verbs are very similar: - -* The first argument is a data frame. - -* The subsequent arguments describe what to do with the data frame. Notice that you can refer - to columns in the data frame directly without using `$`. - -* The result is a new data frame - -Together these properties make it easy to chain together multiple simple steps to achieve a complex result. - -These five functions provide the basis of a language of data manipulation. At the most basic level, you can only alter a tidy data frame in five useful ways: you can reorder the rows (`arrange()`), pick observations and variables of interest (`filter()` and `select()`), add new variables that are functions of existing variables (`mutate()`), or collapse many values to a summary (`summarise()`). The remainder of the language comes from applying the five functions to different types of data. For example, I'll discuss how these functions work with grouped data. +It's most useful in conjunction with grouping, so we'll come back to it after we've learned about `group_by()`. ## Grouped operations @@ -213,15 +428,30 @@ ggplot(delay, aes(dist, delay)) + scale_size_area() ``` -You use `summarise()` with __aggregate functions__, which take a vector of values and return a single number. There are many useful examples of such functions in base R like `min()`, `max()`, `mean()`, `sum()`, `sd()`, `median()`, and `IQR()`. dplyr provides a handful of others: +### Useful summaries -* `n()`: the number of observations in the current group +You use `summarise()` with __aggregate functions__, which take a vector of values and return a single number. -* `n_distinct(x)`:the number of unique values in `x`. +* Location of "middle": `mean(x)`, `median(x)` -* `first(x)`, `last(x)` and `nth(x, n)` - these work - similarly to `x[1]`, `x[length(x)]`, and `x[n]` but give you more control - over the result if the value is missing. +* Measure of spread: `sd(x)`, `IQR(x)`, `mad(x)`. + +* By ranked position: `min(x)`, `quantile(x, 0.25)`, `max(x)` + +* By position: `first(x)`, `nth(x, 2)`, `last(x)`. These work similarly to + `x[1]`, `x[length(x)]`, and `x[n]` but give you more control over the result + if the value is missing. + +* Count: `n()` + +* Distinct count: `n_distinct(x)`. + +* Counts and proportions of logical values: `sum(x > 10)`, `mean(y == 0)` + When used with numeric functions, `TRUE` is converted to 1 and `FALSE` to 0. + This makes `sum()` and `mean()` particularly useful: `sum(x)` gives the number + of `TRUE`s in `x`, and `mean(x)` gives the proportion. + +* `first(x)`, `last(x)` and `nth(x, n)` - For example, we could use these to find the number of planes and the number of flights that go to each possible destination: @@ -233,7 +463,7 @@ summarise(destinations, ) ``` -When used with numeric functions, `TRUE` is converted to 1 and `FALSE` to 0. This makes `sum()` and `mean()` particularly useful: `sum(x)` gives the number of `TRUE`s in `x`, and `mean(x)` gives the proportion. +### Grouping by multiple variables When you group by multiple variables, each summary peels off one level of the grouping. That makes it easy to progressively roll-up a dataset: @@ -244,7 +474,7 @@ 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 (it's not possible to do this exactly for medians). +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. ## Piping @@ -288,147 +518,6 @@ flights %>% filter(arr > 30 | dep > 30) ``` -## Creating - -`data_frame()` is a nice way to create data frames. It encapsulates best practices for data frames: - - * It never changes an input's type (i.e., no more `stringsAsFactors = FALSE`!). - - ```{r} - data.frame(x = letters) %>% sapply(class) - data_frame(x = letters) %>% sapply(class) - ``` - - This makes it easier to use with list-columns: - - ```{r} - data_frame(x = 1:3, y = list(1:5, 1:10, 1:20)) - ``` - - List-columns are most commonly created by `do()`, but they can be useful to - create by hand. - - * It never adjusts the names of variables: - - ```{r} - data.frame(`crazy name` = 1) %>% names() - data_frame(`crazy name` = 1) %>% names() - ``` - - * It evaluates its arguments lazily and sequentially: - - ```{r} - data_frame(x = 1:5, y = x ^ 2) - ``` - - * It adds the `tbl_df()` class to the output so that if you accidentally print a large - data frame you only get the first few rows. - - ```{r} - data_frame(x = 1:5) %>% class() - ``` - - * It changes the behaviour of `[` to always return the same type of object: - subsetting using `[` always returns a `tbl_df()` object; subsetting using - `[[` always returns a column. - - You should be aware of one case where subsetting a `tbl_df()` object - will produce a different result than a `data.frame()` object: - - ```{r} - df <- data.frame(a = 1:2, b = 1:2) - str(df[, "a"]) - - tbldf <- tbl_df(df) - str(tbldf[, "a"]) - ``` - - * It never uses `row.names()`. The whole point of tidy data is to - store variables in a consistent way. So it never stores a variable as - special attribute. - - * It only recycles vectors of length 1. This is because recycling vectors of greater lengths - is a frequent source of bugs. - -### Coercion - -To complement `data_frame()`, dplyr provides `as_data_frame()` to coerce lists into data frames. It does two things: - -* It checks that the input list is valid for a data frame, i.e. that each element - is named, is a 1d atomic vector or list, and all elements have the same - length. - -* It sets the class and attributes of the list to make it behave like a data frame. - This modification does not require a deep copy of the input list, so it's - very fast. - -This is much simpler than `as.data.frame()`. It's hard to explain precisely what `as.data.frame()` does, but it's similar to `do.call(cbind, lapply(x, data.frame))` - i.e. it coerces each component to a data frame and then `cbinds()` them all together. Consequently `as_data_frame()` is much faster than `as.data.frame()`: - -```{r} -l2 <- replicate(26, sample(100), simplify = FALSE) -names(l2) <- letters -microbenchmark::microbenchmark( - as_data_frame(l2), - as.data.frame(l2) -) -``` - -The speed of `as.data.frame()` is not usually a bottleneck when used interactively, but can be a problem when combining thousands of messy inputs into one tidy data frame. - -### tbl_dfs vs data.frames - -There are three key differences between tbl_dfs and data.frames: - -* When you print a tbl_df, it only shows the first ten rows and all the - columns that fit on one screen. It also prints an abbreviated description - of the column type: - - ```{r} - data_frame(x = 1:1000) - ``` - - You can control the default appearance with options: - - * `options(dplyr.print_max = n, dplyr.print_min = m)`: if more than `n` - rows print `m` rows. Use `options(dplyr.print_max = Inf)` to always - show all rows. - - * `options(dply.width = Inf)` will always print all columns, regardless - of the width of the screen. - - -* When you subset a tbl\_df with `[`, it always returns another tbl\_df. - Contrast this with a data frame: sometimes `[` returns a data frame and - sometimes it just returns a single column: - - ```{r} - df1 <- data.frame(x = 1:3, y = 3:1) - class(df1[, 1:2]) - class(df1[, 1]) - - df2 <- data_frame(x = 1:3, y = 3:1) - class(df2[, 1:2]) - class(df2[, 1]) - ``` - - To extract a single column it's use `[[` or `$`: - - ```{r} - class(df2[[1]]) - class(df2$x) - ``` - -* When you extract a variable with `$`, tbl\_dfs never do partial - matching. They'll throw an error if the column doesn't exist: - - ```{r, error = TRUE} - df <- data.frame(abc = 1) - df$a - - df2 <- data_frame(abc = 1) - df2$a - ``` - ## Two-table verbs 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: