2.1 Pipes

DATA 412/612 · Week 2 · PDF · Source (.qmd)

Read the pipe as then. Chain steps instead of nesting calls or leaving extra objects in the environment.

1. Read the pipe as “then”

Note 1.2 introduced the pipe. This note is about using it for a sequence of steps.

You can do several things to the same data by:

  • creating intermediate objects
  • nesting functions
  • piping the result of one function into the next

Read either pipe as then: take what is on the left, then do what follows.

x |> mean()
## Error:
## ! object 'x' not found

is the same idea as mean(x). The gain appears when there are several steps.

In this course you may use either pipe:

|>      # Base R (R 4.1 and later). No extra package.
%>%     # magrittr / tidyverse. Comes with library(tidyverse).

They are interchangeable for the work we do this week. The Base R pipe |> only fills the first argument of the next function. The magrittr pipe %>% can place the left-hand result elsewhere with . if you need a later argument:

x %>% mean(na.rm = TRUE)
## Error:
## ! object 'x' not found
x %>% mean(., na.rm = TRUE)   # same thing; the dot is the piped value
## Error:
## ! object 'x' not found

We will not need the dot this week. Put extra arguments in the function that uses them, as in section 3.

In RStudio, Ctrl+Shift+M (Windows) or Cmd+Shift+M (Mac) inserts a pipe with spaces around it. After a pipe, Enter indents the next line.

You can turn the shortcut toward |> or %>% under Tools → Global Options… → Code.


2. Three ways to compute a geometric mean

The geometric mean is useful for positive, skewed data, ratios, and growth rates. A numerically stable recipe is:

  1. take the log of each value
  2. average those logs
  3. exponentiate the average

Additions of logs are usually more stable than a long product. A small illustration:

a <- sqrt(2)
a^2 == 2
## [1] FALSE
# [1] FALSE

exp(log(a) + log(a)) == 2
## [1] TRUE
# [1] TRUE

Generate some positive numbers so we can compare styles. set.seed() makes rnorm() repeatable.

set.seed(10)
x <- abs(rnorm(100))
head(x)
## [1] 0.01874617 0.18425254 1.37133055 0.59916772 0.29454513 0.38979430
# [1] 0.01874617 0.18425254 1.37133055 0.59916772 0.29454513 0.38979430

rnorm() draws from a normal distribution. abs() makes the draws non-negative so log() is defined.

Intermediate objects

log_x <- log(x)
mean_lx <- mean(log_x)
geo_mean <- exp(mean_lx)
geo_mean
## [1] 0.5703996
# [1] 0.5703996

This is easy to debug one line at a time. The cost is extra names in the environment, especially if you repeat the calculation.

Nested calls

geo_mean <- exp(mean(log(x)))
geo_mean
## [1] 0.5703996
# [1] 0.5703996

Fine for two or three functions. Past that, the parentheses become hard to read and hard to edit.

A pipe

x |>
  log() |>
  mean() |>
  exp()
## [1] 0.5703996
# [1] 0.5703996

One task per line. To keep the result:

geo_mean <- x |>
  log() |>
  mean() |>
  exp()

Some people assign at the end with ->. Either is fine. Left assignment at the top is the usual style in this course, because you can run the pipeline line by line without creating geo_mean until you want it.

Load tidyverse if you want %>% instead of |>:

library(tidyverse)

3. Extra arguments stay in the function that needs them

The piped value usually becomes the first argument of the next function. Other arguments stay written in that call:

geo_mean <- x |>
  log() |>
  mean(na.rm = TRUE) |>
  exp()

That is mean(log(x), na.rm = TRUE), then exp(...).

A pipe helps you:

  • read the work top to bottom instead of inside-out
  • avoid a nest of parentheses
  • add, comment, or drop a step without renaming intermediates

4. subset() keeps the rows you want

subset() is Base R. Give it a data frame and a condition written with column names. It returns the rows where the condition is TRUE.

subset(iris, Sepal.Length > mean(Sepal.Length))
##     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 51           7.0         3.2          4.7         1.4 versicolor
## 52           6.4         3.2          4.5         1.5 versicolor
## 53           6.9         3.1          4.9         1.5 versicolor
## 55           6.5         2.8          4.6         1.5 versicolor
## 57           6.3         3.3          4.7         1.6 versicolor
## 59           6.6         2.9          4.6         1.3 versicolor
## 62           5.9         3.0          4.2         1.5 versicolor
## 63           6.0         2.2          4.0         1.0 versicolor
## 64           6.1         2.9          4.7         1.4 versicolor
## 66           6.7         3.1          4.4         1.4 versicolor
## 69           6.2         2.2          4.5         1.5 versicolor
## 71           5.9         3.2          4.8         1.8 versicolor
## 72           6.1         2.8          4.0         1.3 versicolor
## 73           6.3         2.5          4.9         1.5 versicolor
## 74           6.1         2.8          4.7         1.2 versicolor
## 75           6.4         2.9          4.3         1.3 versicolor
## 76           6.6         3.0          4.4         1.4 versicolor
## 77           6.8         2.8          4.8         1.4 versicolor
## 78           6.7         3.0          5.0         1.7 versicolor
## 79           6.0         2.9          4.5         1.5 versicolor
## 84           6.0         2.7          5.1         1.6 versicolor
## 86           6.0         3.4          4.5         1.6 versicolor
## 87           6.7         3.1          4.7         1.5 versicolor
## 88           6.3         2.3          4.4         1.3 versicolor
## 92           6.1         3.0          4.6         1.4 versicolor
## 98           6.2         2.9          4.3         1.3 versicolor
## 101          6.3         3.3          6.0         2.5  virginica
## 103          7.1         3.0          5.9         2.1  virginica
## 104          6.3         2.9          5.6         1.8  virginica
## 105          6.5         3.0          5.8         2.2  virginica
## 106          7.6         3.0          6.6         2.1  virginica
## 108          7.3         2.9          6.3         1.8  virginica
## 109          6.7         2.5          5.8         1.8  virginica
## 110          7.2         3.6          6.1         2.5  virginica
## 111          6.5         3.2          5.1         2.0  virginica
## 112          6.4         2.7          5.3         1.9  virginica
## 113          6.8         3.0          5.5         2.1  virginica
## 116          6.4         3.2          5.3         2.3  virginica
## 117          6.5         3.0          5.5         1.8  virginica
## 118          7.7         3.8          6.7         2.2  virginica
## 119          7.7         2.6          6.9         2.3  virginica
## 120          6.0         2.2          5.0         1.5  virginica
## 121          6.9         3.2          5.7         2.3  virginica
## 123          7.7         2.8          6.7         2.0  virginica
## 124          6.3         2.7          4.9         1.8  virginica
## 125          6.7         3.3          5.7         2.1  virginica
## 126          7.2         3.2          6.0         1.8  virginica
## 127          6.2         2.8          4.8         1.8  virginica
## 128          6.1         3.0          4.9         1.8  virginica
## 129          6.4         2.8          5.6         2.1  virginica
## 130          7.2         3.0          5.8         1.6  virginica
## 131          7.4         2.8          6.1         1.9  virginica
## 132          7.9         3.8          6.4         2.0  virginica
## 133          6.4         2.8          5.6         2.2  virginica
## 134          6.3         2.8          5.1         1.5  virginica
## 135          6.1         2.6          5.6         1.4  virginica
## 136          7.7         3.0          6.1         2.3  virginica
## 137          6.3         3.4          5.6         2.4  virginica
## 138          6.4         3.1          5.5         1.8  virginica
## 139          6.0         3.0          4.8         1.8  virginica
## 140          6.9         3.1          5.4         2.1  virginica
## 141          6.7         3.1          5.6         2.4  virginica
## 142          6.9         3.1          5.1         2.3  virginica
## 144          6.8         3.2          5.9         2.3  virginica
## 145          6.7         3.3          5.7         2.5  virginica
## 146          6.7         3.0          5.2         2.3  virginica
## 147          6.3         2.5          5.0         1.9  virginica
## 148          6.5         3.0          5.2         2.0  virginica
## 149          6.2         3.4          5.4         2.3  virginica
## 150          5.9         3.0          5.1         1.8  virginica

That is the same idea as indexing, but you do not have to repeat the data name:

iris[iris$Sepal.Length > mean(iris$Sepal.Length), ]
##     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 51           7.0         3.2          4.7         1.4 versicolor
## 52           6.4         3.2          4.5         1.5 versicolor
## 53           6.9         3.1          4.9         1.5 versicolor
## 55           6.5         2.8          4.6         1.5 versicolor
## 57           6.3         3.3          4.7         1.6 versicolor
## 59           6.6         2.9          4.6         1.3 versicolor
## 62           5.9         3.0          4.2         1.5 versicolor
## 63           6.0         2.2          4.0         1.0 versicolor
## 64           6.1         2.9          4.7         1.4 versicolor
## 66           6.7         3.1          4.4         1.4 versicolor
## 69           6.2         2.2          4.5         1.5 versicolor
## 71           5.9         3.2          4.8         1.8 versicolor
## 72           6.1         2.8          4.0         1.3 versicolor
## 73           6.3         2.5          4.9         1.5 versicolor
## 74           6.1         2.8          4.7         1.2 versicolor
## 75           6.4         2.9          4.3         1.3 versicolor
## 76           6.6         3.0          4.4         1.4 versicolor
## 77           6.8         2.8          4.8         1.4 versicolor
## 78           6.7         3.0          5.0         1.7 versicolor
## 79           6.0         2.9          4.5         1.5 versicolor
## 84           6.0         2.7          5.1         1.6 versicolor
## 86           6.0         3.4          4.5         1.6 versicolor
## 87           6.7         3.1          4.7         1.5 versicolor
## 88           6.3         2.3          4.4         1.3 versicolor
## 92           6.1         3.0          4.6         1.4 versicolor
## 98           6.2         2.9          4.3         1.3 versicolor
## 101          6.3         3.3          6.0         2.5  virginica
## 103          7.1         3.0          5.9         2.1  virginica
## 104          6.3         2.9          5.6         1.8  virginica
## 105          6.5         3.0          5.8         2.2  virginica
## 106          7.6         3.0          6.6         2.1  virginica
## 108          7.3         2.9          6.3         1.8  virginica
## 109          6.7         2.5          5.8         1.8  virginica
## 110          7.2         3.6          6.1         2.5  virginica
## 111          6.5         3.2          5.1         2.0  virginica
## 112          6.4         2.7          5.3         1.9  virginica
## 113          6.8         3.0          5.5         2.1  virginica
## 116          6.4         3.2          5.3         2.3  virginica
## 117          6.5         3.0          5.5         1.8  virginica
## 118          7.7         3.8          6.7         2.2  virginica
## 119          7.7         2.6          6.9         2.3  virginica
## 120          6.0         2.2          5.0         1.5  virginica
## 121          6.9         3.2          5.7         2.3  virginica
## 123          7.7         2.8          6.7         2.0  virginica
## 124          6.3         2.7          4.9         1.8  virginica
## 125          6.7         3.3          5.7         2.1  virginica
## 126          7.2         3.2          6.0         1.8  virginica
## 127          6.2         2.8          4.8         1.8  virginica
## 128          6.1         3.0          4.9         1.8  virginica
## 129          6.4         2.8          5.6         2.1  virginica
## 130          7.2         3.0          5.8         1.6  virginica
## 131          7.4         2.8          6.1         1.9  virginica
## 132          7.9         3.8          6.4         2.0  virginica
## 133          6.4         2.8          5.6         2.2  virginica
## 134          6.3         2.8          5.1         1.5  virginica
## 135          6.1         2.6          5.6         1.4  virginica
## 136          7.7         3.0          6.1         2.3  virginica
## 137          6.3         3.4          5.6         2.4  virginica
## 138          6.4         3.1          5.5         1.8  virginica
## 139          6.0         3.0          4.8         1.8  virginica
## 140          6.9         3.1          5.4         2.1  virginica
## 141          6.7         3.1          5.6         2.4  virginica
## 142          6.9         3.1          5.1         2.3  virginica
## 144          6.8         3.2          5.9         2.3  virginica
## 145          6.7         3.3          5.7         2.5  virginica
## 146          6.7         3.0          5.2         2.3  virginica
## 147          6.3         2.5          5.0         1.9  virginica
## 148          6.5         3.0          5.2         2.0  virginica
## 149          6.2         3.4          5.4         2.3  virginica
## 150          5.9         3.0          5.1         1.8  virginica

The optional select argument keeps columns. You can name them, or drop some with -:

subset(iris, Sepal.Length > 5, select = c(Sepal.Length, Species))
##     Sepal.Length    Species
## 1            5.1     setosa
## 6            5.4     setosa
## 11           5.4     setosa
## 15           5.8     setosa
## 16           5.7     setosa
## 17           5.4     setosa
## 18           5.1     setosa
## 19           5.7     setosa
## 20           5.1     setosa
## 21           5.4     setosa
## 22           5.1     setosa
## 24           5.1     setosa
## 28           5.2     setosa
## 29           5.2     setosa
## 32           5.4     setosa
## 33           5.2     setosa
## 34           5.5     setosa
## 37           5.5     setosa
## 40           5.1     setosa
## 45           5.1     setosa
## 47           5.1     setosa
## 49           5.3     setosa
## 51           7.0 versicolor
## 52           6.4 versicolor
## 53           6.9 versicolor
## 54           5.5 versicolor
## 55           6.5 versicolor
## 56           5.7 versicolor
## 57           6.3 versicolor
## 59           6.6 versicolor
## 60           5.2 versicolor
## 62           5.9 versicolor
## 63           6.0 versicolor
## 64           6.1 versicolor
## 65           5.6 versicolor
## 66           6.7 versicolor
## 67           5.6 versicolor
## 68           5.8 versicolor
## 69           6.2 versicolor
## 70           5.6 versicolor
## 71           5.9 versicolor
## 72           6.1 versicolor
## 73           6.3 versicolor
## 74           6.1 versicolor
## 75           6.4 versicolor
## 76           6.6 versicolor
## 77           6.8 versicolor
## 78           6.7 versicolor
## 79           6.0 versicolor
## 80           5.7 versicolor
## 81           5.5 versicolor
## 82           5.5 versicolor
## 83           5.8 versicolor
## 84           6.0 versicolor
## 85           5.4 versicolor
## 86           6.0 versicolor
## 87           6.7 versicolor
## 88           6.3 versicolor
## 89           5.6 versicolor
## 90           5.5 versicolor
## 91           5.5 versicolor
## 92           6.1 versicolor
## 93           5.8 versicolor
## 95           5.6 versicolor
## 96           5.7 versicolor
## 97           5.7 versicolor
## 98           6.2 versicolor
## 99           5.1 versicolor
## 100          5.7 versicolor
## 101          6.3  virginica
## 102          5.8  virginica
## 103          7.1  virginica
## 104          6.3  virginica
## 105          6.5  virginica
## 106          7.6  virginica
## 108          7.3  virginica
## 109          6.7  virginica
## 110          7.2  virginica
## 111          6.5  virginica
## 112          6.4  virginica
## 113          6.8  virginica
## 114          5.7  virginica
## 115          5.8  virginica
## 116          6.4  virginica
## 117          6.5  virginica
## 118          7.7  virginica
## 119          7.7  virginica
## 120          6.0  virginica
## 121          6.9  virginica
## 122          5.6  virginica
## 123          7.7  virginica
## 124          6.3  virginica
## 125          6.7  virginica
## 126          7.2  virginica
## 127          6.2  virginica
## 128          6.1  virginica
## 129          6.4  virginica
## 130          7.2  virginica
## 131          7.4  virginica
## 132          7.9  virginica
## 133          6.4  virginica
## 134          6.3  virginica
## 135          6.1  virginica
## 136          7.7  virginica
## 137          6.3  virginica
## 138          6.4  virginica
## 139          6.0  virginica
## 140          6.9  virginica
## 141          6.7  virginica
## 142          6.9  virginica
## 143          5.8  virginica
## 144          6.8  virginica
## 145          6.7  virginica
## 146          6.7  virginica
## 147          6.3  virginica
## 148          6.5  virginica
## 149          6.2  virginica
## 150          5.9  virginica
subset(iris, Sepal.Length > 5, select = -c(Sepal.Width, Petal.Width))
##     Sepal.Length Petal.Length    Species
## 1            5.1          1.4     setosa
## 6            5.4          1.7     setosa
## 11           5.4          1.5     setosa
## 15           5.8          1.2     setosa
## 16           5.7          1.5     setosa
## 17           5.4          1.3     setosa
## 18           5.1          1.4     setosa
## 19           5.7          1.7     setosa
## 20           5.1          1.5     setosa
## 21           5.4          1.7     setosa
## 22           5.1          1.5     setosa
## 24           5.1          1.7     setosa
## 28           5.2          1.5     setosa
## 29           5.2          1.4     setosa
## 32           5.4          1.5     setosa
## 33           5.2          1.5     setosa
## 34           5.5          1.4     setosa
## 37           5.5          1.3     setosa
## 40           5.1          1.5     setosa
## 45           5.1          1.9     setosa
## 47           5.1          1.6     setosa
## 49           5.3          1.5     setosa
## 51           7.0          4.7 versicolor
## 52           6.4          4.5 versicolor
## 53           6.9          4.9 versicolor
## 54           5.5          4.0 versicolor
## 55           6.5          4.6 versicolor
## 56           5.7          4.5 versicolor
## 57           6.3          4.7 versicolor
## 59           6.6          4.6 versicolor
## 60           5.2          3.9 versicolor
## 62           5.9          4.2 versicolor
## 63           6.0          4.0 versicolor
## 64           6.1          4.7 versicolor
## 65           5.6          3.6 versicolor
## 66           6.7          4.4 versicolor
## 67           5.6          4.5 versicolor
## 68           5.8          4.1 versicolor
## 69           6.2          4.5 versicolor
## 70           5.6          3.9 versicolor
## 71           5.9          4.8 versicolor
## 72           6.1          4.0 versicolor
## 73           6.3          4.9 versicolor
## 74           6.1          4.7 versicolor
## 75           6.4          4.3 versicolor
## 76           6.6          4.4 versicolor
## 77           6.8          4.8 versicolor
## 78           6.7          5.0 versicolor
## 79           6.0          4.5 versicolor
## 80           5.7          3.5 versicolor
## 81           5.5          3.8 versicolor
## 82           5.5          3.7 versicolor
## 83           5.8          3.9 versicolor
## 84           6.0          5.1 versicolor
## 85           5.4          4.5 versicolor
## 86           6.0          4.5 versicolor
## 87           6.7          4.7 versicolor
## 88           6.3          4.4 versicolor
## 89           5.6          4.1 versicolor
## 90           5.5          4.0 versicolor
## 91           5.5          4.4 versicolor
## 92           6.1          4.6 versicolor
## 93           5.8          4.0 versicolor
## 95           5.6          4.2 versicolor
## 96           5.7          4.2 versicolor
## 97           5.7          4.2 versicolor
## 98           6.2          4.3 versicolor
## 99           5.1          3.0 versicolor
## 100          5.7          4.1 versicolor
## 101          6.3          6.0  virginica
## 102          5.8          5.1  virginica
## 103          7.1          5.9  virginica
## 104          6.3          5.6  virginica
## 105          6.5          5.8  virginica
## 106          7.6          6.6  virginica
## 108          7.3          6.3  virginica
## 109          6.7          5.8  virginica
## 110          7.2          6.1  virginica
## 111          6.5          5.1  virginica
## 112          6.4          5.3  virginica
## 113          6.8          5.5  virginica
## 114          5.7          5.0  virginica
## 115          5.8          5.1  virginica
## 116          6.4          5.3  virginica
## 117          6.5          5.5  virginica
## 118          7.7          6.7  virginica
## 119          7.7          6.9  virginica
## 120          6.0          5.0  virginica
## 121          6.9          5.7  virginica
## 122          5.6          4.9  virginica
## 123          7.7          6.7  virginica
## 124          6.3          4.9  virginica
## 125          6.7          5.7  virginica
## 126          7.2          6.0  virginica
## 127          6.2          4.8  virginica
## 128          6.1          4.9  virginica
## 129          6.4          5.6  virginica
## 130          7.2          5.8  virginica
## 131          7.4          6.1  virginica
## 132          7.9          6.4  virginica
## 133          6.4          5.6  virginica
## 134          6.3          5.1  virginica
## 135          6.1          5.6  virginica
## 136          7.7          6.1  virginica
## 137          6.3          5.6  virginica
## 138          6.4          5.5  virginica
## 139          6.0          4.8  virginica
## 140          6.9          5.4  virginica
## 141          6.7          5.6  virginica
## 142          6.9          5.1  virginica
## 143          5.8          5.1  virginica
## 144          6.8          5.9  virginica
## 145          6.7          5.7  virginica
## 146          6.7          5.2  virginica
## 147          6.3          5.0  virginica
## 148          6.5          5.2  virginica
## 149          6.2          5.4  virginica
## 150          5.9          5.1  virginica

subset() also works on a vector. The condition is written in terms of the vector itself:

x <- c(2, 9, 4, 11)
subset(x, x > 5)
## [1]  9 11
# [1]  9 11

Rows (or values) where the condition is NA are dropped. ?subset says the function is convenient for interactive work. In a function you will keep, prefer [ or the dplyr verbs below. Non-standard evaluation of column names is the reason.

The closest dplyr functions

dplyr splits the two jobs subset() can do in one call:

  • filter() is the closest match to the row condition (the second argument of subset())
  • select() is the closest match to select = ...
library(dplyr)

iris |>
  filter(Sepal.Length > mean(Sepal.Length))
##    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 1           7.0         3.2          4.7         1.4 versicolor
## 2           6.4         3.2          4.5         1.5 versicolor
## 3           6.9         3.1          4.9         1.5 versicolor
## 4           6.5         2.8          4.6         1.5 versicolor
## 5           6.3         3.3          4.7         1.6 versicolor
## 6           6.6         2.9          4.6         1.3 versicolor
## 7           5.9         3.0          4.2         1.5 versicolor
## 8           6.0         2.2          4.0         1.0 versicolor
## 9           6.1         2.9          4.7         1.4 versicolor
## 10          6.7         3.1          4.4         1.4 versicolor
## 11          6.2         2.2          4.5         1.5 versicolor
## 12          5.9         3.2          4.8         1.8 versicolor
## 13          6.1         2.8          4.0         1.3 versicolor
## 14          6.3         2.5          4.9         1.5 versicolor
## 15          6.1         2.8          4.7         1.2 versicolor
## 16          6.4         2.9          4.3         1.3 versicolor
## 17          6.6         3.0          4.4         1.4 versicolor
## 18          6.8         2.8          4.8         1.4 versicolor
## 19          6.7         3.0          5.0         1.7 versicolor
## 20          6.0         2.9          4.5         1.5 versicolor
## 21          6.0         2.7          5.1         1.6 versicolor
## 22          6.0         3.4          4.5         1.6 versicolor
## 23          6.7         3.1          4.7         1.5 versicolor
## 24          6.3         2.3          4.4         1.3 versicolor
## 25          6.1         3.0          4.6         1.4 versicolor
## 26          6.2         2.9          4.3         1.3 versicolor
## 27          6.3         3.3          6.0         2.5  virginica
## 28          7.1         3.0          5.9         2.1  virginica
## 29          6.3         2.9          5.6         1.8  virginica
## 30          6.5         3.0          5.8         2.2  virginica
## 31          7.6         3.0          6.6         2.1  virginica
## 32          7.3         2.9          6.3         1.8  virginica
## 33          6.7         2.5          5.8         1.8  virginica
## 34          7.2         3.6          6.1         2.5  virginica
## 35          6.5         3.2          5.1         2.0  virginica
## 36          6.4         2.7          5.3         1.9  virginica
## 37          6.8         3.0          5.5         2.1  virginica
## 38          6.4         3.2          5.3         2.3  virginica
## 39          6.5         3.0          5.5         1.8  virginica
## 40          7.7         3.8          6.7         2.2  virginica
## 41          7.7         2.6          6.9         2.3  virginica
## 42          6.0         2.2          5.0         1.5  virginica
## 43          6.9         3.2          5.7         2.3  virginica
## 44          7.7         2.8          6.7         2.0  virginica
## 45          6.3         2.7          4.9         1.8  virginica
## 46          6.7         3.3          5.7         2.1  virginica
## 47          7.2         3.2          6.0         1.8  virginica
## 48          6.2         2.8          4.8         1.8  virginica
## 49          6.1         3.0          4.9         1.8  virginica
## 50          6.4         2.8          5.6         2.1  virginica
## 51          7.2         3.0          5.8         1.6  virginica
## 52          7.4         2.8          6.1         1.9  virginica
## 53          7.9         3.8          6.4         2.0  virginica
## 54          6.4         2.8          5.6         2.2  virginica
## 55          6.3         2.8          5.1         1.5  virginica
## 56          6.1         2.6          5.6         1.4  virginica
## 57          7.7         3.0          6.1         2.3  virginica
## 58          6.3         3.4          5.6         2.4  virginica
## 59          6.4         3.1          5.5         1.8  virginica
## 60          6.0         3.0          4.8         1.8  virginica
## 61          6.9         3.1          5.4         2.1  virginica
## 62          6.7         3.1          5.6         2.4  virginica
## 63          6.9         3.1          5.1         2.3  virginica
## 64          6.8         3.2          5.9         2.3  virginica
## 65          6.7         3.3          5.7         2.5  virginica
## 66          6.7         3.0          5.2         2.3  virginica
## 67          6.3         2.5          5.0         1.9  virginica
## 68          6.5         3.0          5.2         2.0  virginica
## 69          6.2         3.4          5.4         2.3  virginica
## 70          5.9         3.0          5.1         1.8  virginica
iris |>
  filter(Sepal.Length > 5) |>
  select(Sepal.Length, Species)
##     Sepal.Length    Species
## 1            5.1     setosa
## 2            5.4     setosa
## 3            5.4     setosa
## 4            5.8     setosa
## 5            5.7     setosa
## 6            5.4     setosa
## 7            5.1     setosa
## 8            5.7     setosa
## 9            5.1     setosa
## 10           5.4     setosa
## 11           5.1     setosa
## 12           5.1     setosa
## 13           5.2     setosa
## 14           5.2     setosa
## 15           5.4     setosa
## 16           5.2     setosa
## 17           5.5     setosa
## 18           5.5     setosa
## 19           5.1     setosa
## 20           5.1     setosa
## 21           5.1     setosa
## 22           5.3     setosa
## 23           7.0 versicolor
## 24           6.4 versicolor
## 25           6.9 versicolor
## 26           5.5 versicolor
## 27           6.5 versicolor
## 28           5.7 versicolor
## 29           6.3 versicolor
## 30           6.6 versicolor
## 31           5.2 versicolor
## 32           5.9 versicolor
## 33           6.0 versicolor
## 34           6.1 versicolor
## 35           5.6 versicolor
## 36           6.7 versicolor
## 37           5.6 versicolor
## 38           5.8 versicolor
## 39           6.2 versicolor
## 40           5.6 versicolor
## 41           5.9 versicolor
## 42           6.1 versicolor
## 43           6.3 versicolor
## 44           6.1 versicolor
## 45           6.4 versicolor
## 46           6.6 versicolor
## 47           6.8 versicolor
## 48           6.7 versicolor
## 49           6.0 versicolor
## 50           5.7 versicolor
## 51           5.5 versicolor
## 52           5.5 versicolor
## 53           5.8 versicolor
## 54           6.0 versicolor
## 55           5.4 versicolor
## 56           6.0 versicolor
## 57           6.7 versicolor
## 58           6.3 versicolor
## 59           5.6 versicolor
## 60           5.5 versicolor
## 61           5.5 versicolor
## 62           6.1 versicolor
## 63           5.8 versicolor
## 64           5.6 versicolor
## 65           5.7 versicolor
## 66           5.7 versicolor
## 67           6.2 versicolor
## 68           5.1 versicolor
## 69           5.7 versicolor
## 70           6.3  virginica
## 71           5.8  virginica
## 72           7.1  virginica
## 73           6.3  virginica
## 74           6.5  virginica
## 75           7.6  virginica
## 76           7.3  virginica
## 77           6.7  virginica
## 78           7.2  virginica
## 79           6.5  virginica
## 80           6.4  virginica
## 81           6.8  virginica
## 82           5.7  virginica
## 83           5.8  virginica
## 84           6.4  virginica
## 85           6.5  virginica
## 86           7.7  virginica
## 87           7.7  virginica
## 88           6.0  virginica
## 89           6.9  virginica
## 90           5.6  virginica
## 91           7.7  virginica
## 92           6.3  virginica
## 93           6.7  virginica
## 94           7.2  virginica
## 95           6.2  virginica
## 96           6.1  virginica
## 97           6.4  virginica
## 98           7.2  virginica
## 99           7.4  virginica
## 100          7.9  virginica
## 101          6.4  virginica
## 102          6.3  virginica
## 103          6.1  virginica
## 104          7.7  virginica
## 105          6.3  virginica
## 106          6.4  virginica
## 107          6.0  virginica
## 108          6.9  virginica
## 109          6.7  virginica
## 110          6.9  virginica
## 111          5.8  virginica
## 112          6.8  virginica
## 113          6.7  virginica
## 114          6.7  virginica
## 115          6.3  virginica
## 116          6.5  virginica
## 117          6.2  virginica
## 118          5.9  virginica

filter() and select() are the tidyverse versions we will use later. You can still read subset() when you see it, including in the next example.


5. Other magrittr pipes (aside)

magrittr also has %\%$, which exposes column names on the right-hand side. You may see it in older code. We will stay with |> or %>%.

The next pipeline first uses subset() to keep the longer sepals, then %$% so cor() can see Sepal.Length and Sepal.Width as names rather than as iris$.... dplyr::filter() would do the same row step. dplyr::select() plus cor() on two columns, or dplyr::summarize(cor = cor(Sepal.Length, Sepal.Width)) after filter(), is the tidyverse version of the whole thing.

library(magrittr)
iris |>
  subset(Sepal.Length > mean(Sepal.Length)) %$%
  cor(Sepal.Length, Sepal.Width)
## [1] 0.3361992
# [1] 0.3361992

6. Practice

Using a pipe, and without intermediate objects:

  1. draw 100 values from a normal distribution with standard deviation 10
  2. sort them
  3. take lagged differences
  4. average those differences
  5. round the average to one decimal place

Useful functions: rnorm(), sort(), diff(), mean(), round(). Use set.seed() if you want a repeatable number.