2.1 Pipes
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:
- take the log of each value
- average those logs
- 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 ofsubset())select()is the closest match toselect = ...
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:
- draw 100 values from a normal distribution with standard deviation 10
- sort them
- take lagged differences
- average those differences
- round the average to one decimal place
Useful functions: rnorm(), sort(),
diff(), mean(), round(). Use
set.seed() if you want a repeatable number.