Piping!

Alex Bushby
January 12, 2022

Have you ever done this?

  • function in a function in a function, etc.
#subset(subset(mtcars, mpg > 20), gear == 4)
head(subset(subset(mtcars, mpg > 20), gear == 4), n = 3)
               mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4     21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710    22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

... or this?

  • naming unnecessary objects in R
#subset(subset(mtcars, mpg > 20), gear == 4)
mpg20 <- subset(mtcars, mpg > 20)
gear4mpg20 <- subset(mpg20, gear == 4)
head(gear4mpg20, n = 3)
               mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4     21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710    22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

This is piping:

library(magrittr)
mtcars %>% 
  subset(mpg > 20) %>%  
  subset(gear == 4) %>% 
  head(n = 3)
               mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4     21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710    22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

This is piping:

library(magrittr)
mtcars %>% # mtcars is the input for subset(mpg > 20)
  subset(., mpg > 20) %>%  # subset(mtcars, mpg > 20) is the input
                        # for subset(gear == 4)
  subset(., gear == 4) %>% # subset(subset(mtcars, mpg > 20), gear == 4) 
                        # is the input for head(n = 3)
  head(., n = 3)
               mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4     21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710    22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

Important things to know

  • If input is not a argument in the first position in the function on the next line, we put a period where the object should go:
mtcars$VS <- mtcars$vs %>%
  gsub(0, "V-shaped", .) %>% # replace all 0s with V-shaped
  gsub(1, "Straight", .) # replace all 1s with Straight

head(mtcars, n = 3)
               mpg cyl disp  hp drat    wt  qsec vs am gear carb       VS
Mazda RX4     21.0   6  160 110 3.90 2.620 16.46  0  1    4    4 V-shaped
Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4 V-shaped
Datsun 710    22.8   4  108  93 3.85 2.320 18.61  1  1    4    1 Straight

Important things to know

  • Can have the input in multiple positions in the function on the next line:
mtcars %>%
  aggregate(formula = . ~ VS, data = ., FUN = mean)
        VS      mpg      cyl     disp        hp     drat       wt     qsec vs
1 Straight 24.55714 4.571429 132.4571  91.35714 3.859286 2.611286 19.33357  1
2 V-shaped 16.61667 7.444444 307.1500 189.72222 3.392222 3.688556 16.69389  0
         am     gear     carb
1 0.5000000 3.857143 1.785714
2 0.3333333 3.555556 3.611111

Resources for piping: