code is a tool of communication

library(magrittr)
library(dplyr)
library(pryr)
library(ggplot2)
diamonds <- diamonds
diamonds2 <- diamonds %>% 
  mutate(price_per_carat = price / carat)
object_size(diamonds)
3.46 MB
object_size(diamonds2)
3.89 MB
object_size(diamonds,diamonds2)
3.89 MB

Other tools from the magrittr package.

rnorm(100) %>%
  matrix(ncol = 2) %>%
  plot() %>%
  str()
 NULL

tee

rnorm(100) %>%
  matrix(ncol = 2) %T>%
  plot() %>%
  str()
 num [1:50, 1:2] 0.433 1.173 0.386 0.25 0.568 ...

explodes out.

mtcars %$%
  cor(disp, mpg)
[1] -0.8475514
mtcars %<>% transform(cyl = cyl * 2)

Functions

df <- tibble::tibble(
  a = rnorm(10),
  b = rnorm(10),
  c = rnorm(10),
  d = rnorm(10)
)
df$a <- (df$a - min(df$a, na.rm = TRUE)) / 
  (max(df$a, na.rm = TRUE) - min(df$a, na.rm = TRUE))
df$b <- (df$b - min(df$b, na.rm = TRUE)) / 
  (max(df$b, na.rm = TRUE) - min(df$a, na.rm = TRUE))
df$c <- (df$c - min(df$c, na.rm = TRUE)) / 
  (max(df$c, na.rm = TRUE) - min(df$c, na.rm = TRUE))
df$d <- (df$d - min(df$d, na.rm = TRUE)) / 
  (max(df$d, na.rm = TRUE) - min(df$d, na.rm = TRUE))
rescale01 <- function(x) {
  rng <- range(x, na.rm = TRUE)
  (x - rng[1]) / (rng[2] - rng[1])
}
rescale01(c(0, 5, 10))
[1] 0.0 0.5 1.0
x <- c(1:10, Inf)
rescale01(x)
 [1]   0   0   0   0   0   0   0   0   0   0 NaN
rescale01 <- function(x) {
  rng <- range(x, na.rm = TRUE, finite = TRUE)
  (x - rng[1]) / (rng[2] - rng[1])
}
rescale01(x)
 [1] 0.0000000 0.1111111 0.2222222 0.3333333 0.4444444 0.5555556 0.6666667 0.7777778 0.8888889
[10] 1.0000000       Inf
# Compute confidence interval around mean using normal approximation
mean_ci <- function(x, conf = 0.95) {
  se <- sd(x) / sqrt(length(x))
  alpha <- 1 - conf
  mean(x) + se * qnorm(c(alpha / 2, 1 - alpha / 2))
}
x <- runif(100)
mean_ci(x)
[1] 0.4650151 0.5799727
#> [1] 0.498 0.610
mean_ci(x, conf = 0.99)
[1] 0.4469539 0.5980339
#> [1] 0.480 0.628

Checking values

wt_mean <- function(x, w) {
  sum(x * w) / sum(w)
}
wt_var <- function(x, w) {
  mu <- wt_mean(x, w)
  sum(w * (x - mu) ^ 2) / sum(w)
}
wt_sd <- function(x, w) {
  sqrt(wt_var(x, w))
}
wt_mean(1:6, 1:3)
[1] 7.666667
wt_mean <- function(x, w) {
  if (length(x) != length(w)) {
    stop("`x` and `w` must be the same length", call. = FALSE)
  }
  sum(w * x) / sum(w)
}

Vectors

library(tidyverse)
typeof(letters)
[1] "character"
typeof(1:10)
[1] "integer"
1:10 %% 3 == 0
 [1] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE
typeof(1)
[1] "double"
typeof(1L)
[1] "integer"
sample(10) + 100
 [1] 106 103 109 105 108 101 107 110 102 104
runif(10) > 0.5
 [1]  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE
tibble(x = 1:4, y = rep(1:2, 2))
tibble(x = 1:4, y = rep(1:2, each = 2))
x_named <- list(a = 1, b = 2, c = 3)
str(x_named)
List of 3
 $ a: num 1
 $ b: num 2
 $ c: num 3
x1 <- list(c(1, 2), c(3, 4))
x2 <- list(list(1, 2), list(3, 4))
x3 <- list(1, list(2, list(3)))

Subsetting

a <- list(a = 1:3, b = "a string", c = pi, d = list(-1, -5))

Functions

flip <- function() sample(c("T", "H"), 1)
flips <- 0
nheads <- 0
while (nheads < 3) {
  if (flip() == "H") {
    nheads <- nheads + 1
  } else {
    nheads <- 0
  }
  flips <- flips + 1
}
flips
[1] 17
df <- tibble(
  a = rnorm(10),
  b = rnorm(10),
  c = rnorm(10),
  d = rnorm(10)
)
map_dbl(df, mean)
         a          b          c          d 
-0.3449303 -0.4874738  0.3718107  0.2297544 
map_dbl(df, median)
         a          b          c          d 
-0.3854993 -0.4215123  0.4789902  0.3901601 
map_dbl(df, sd)
        a         b         c         d 
0.4261496 1.1121509 0.5676953 1.2017317 
df %>% map_dbl(mean)
         a          b          c          d 
-0.3449303 -0.4874738  0.3718107  0.2297544 
df %>% map_dbl(median)
         a          b          c          d 
-0.3854993 -0.4215123  0.4789902  0.3901601 
df %>% map_dbl(sd)
        a         b         c         d 
0.4261496 1.1121509 0.5676953 1.2017317 
models <- mtcars %>% 
  split(.$cyl) %>% 
  map(function(df) lm(mpg ~ wt, data = df))
models <- mtcars %>% 
  split(.$cyl) %>% 
  map(~lm(mpg ~ wt, data = .))
models %>% 
  map(summary) %>% 
  map_dbl(~.$r.squared)
        8        12        16 
0.5086326 0.4645102 0.4229655 
LS0tCnRpdGxlOiAiUHJvZ3JhbSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKY29kZSBpcyBhIHRvb2wgb2YgY29tbXVuaWNhdGlvbiAKCi0gdGhlIHBpcGUKLSBmdW5jdGlvbnMKLSBkYXRhIHN0cnVjdHVyZXMKLSBpdGVyYXRpb24KCmBgYHtyfQpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHByeXIpCmxpYnJhcnkoZ2dwbG90MikKCmRpYW1vbmRzIDwtIGRpYW1vbmRzCmRpYW1vbmRzMiA8LSBkaWFtb25kcyAlPiUgCiAgbXV0YXRlKHByaWNlX3Blcl9jYXJhdCA9IHByaWNlIC8gY2FyYXQpCgpvYmplY3Rfc2l6ZShkaWFtb25kcykKb2JqZWN0X3NpemUoZGlhbW9uZHMyKQpvYmplY3Rfc2l6ZShkaWFtb25kcyxkaWFtb25kczIpCgpgYGAKCk90aGVyIHRvb2xzIGZyb20gdGhlIG1hZ3JpdHRyIHBhY2thZ2UuCgpgYGB7cn0Kcm5vcm0oMTAwKSAlPiUKICBtYXRyaXgobmNvbCA9IDIpICU+JQogIHBsb3QoKSAlPiUKICBzdHIoKQpgYGAKCnRlZQoKYGBge3J9CnJub3JtKDEwMCkgJT4lCiAgbWF0cml4KG5jb2wgPSAyKSAlVD4lCiAgcGxvdCgpICU+JQogIHN0cigpCmBgYAoKZXhwbG9kZXMgb3V0LgoKYGBge3J9Cm10Y2FycyAlJCUKICBjb3IoZGlzcCwgbXBnKQpgYGAKCgpgYGB7cn0KbXRjYXJzICU8PiUgdHJhbnNmb3JtKGN5bCA9IGN5bCAqIDIpCmBgYAoKCiMgRnVuY3Rpb25zCgpgYGB7cn0KZGYgPC0gdGliYmxlOjp0aWJibGUoCiAgYSA9IHJub3JtKDEwKSwKICBiID0gcm5vcm0oMTApLAogIGMgPSBybm9ybSgxMCksCiAgZCA9IHJub3JtKDEwKQopCgpkZiRhIDwtIChkZiRhIC0gbWluKGRmJGEsIG5hLnJtID0gVFJVRSkpIC8gCiAgKG1heChkZiRhLCBuYS5ybSA9IFRSVUUpIC0gbWluKGRmJGEsIG5hLnJtID0gVFJVRSkpCmRmJGIgPC0gKGRmJGIgLSBtaW4oZGYkYiwgbmEucm0gPSBUUlVFKSkgLyAKICAobWF4KGRmJGIsIG5hLnJtID0gVFJVRSkgLSBtaW4oZGYkYSwgbmEucm0gPSBUUlVFKSkKZGYkYyA8LSAoZGYkYyAtIG1pbihkZiRjLCBuYS5ybSA9IFRSVUUpKSAvIAogIChtYXgoZGYkYywgbmEucm0gPSBUUlVFKSAtIG1pbihkZiRjLCBuYS5ybSA9IFRSVUUpKQpkZiRkIDwtIChkZiRkIC0gbWluKGRmJGQsIG5hLnJtID0gVFJVRSkpIC8gCiAgKG1heChkZiRkLCBuYS5ybSA9IFRSVUUpIC0gbWluKGRmJGQsIG5hLnJtID0gVFJVRSkpCmBgYAoKCmBgYHtyfQpyZXNjYWxlMDEgPC0gZnVuY3Rpb24oeCkgewogIHJuZyA8LSByYW5nZSh4LCBuYS5ybSA9IFRSVUUpCiAgKHggLSBybmdbMV0pIC8gKHJuZ1syXSAtIHJuZ1sxXSkKfQoKcmVzY2FsZTAxKGMoMCwgNSwgMTApKQpgYGAKCgpgYGB7cn0KeCA8LSBjKDE6MTAsIEluZikKcmVzY2FsZTAxKHgpCmBgYAoKCmBgYHtyfQpyZXNjYWxlMDEgPC0gZnVuY3Rpb24oeCkgewogIHJuZyA8LSByYW5nZSh4LCBuYS5ybSA9IFRSVUUsIGZpbml0ZSA9IFRSVUUpCiAgKHggLSBybmdbMV0pIC8gKHJuZ1syXSAtIHJuZ1sxXSkKfQpyZXNjYWxlMDEoeCkKYGBgCgoKYGBge3J9CiMgQ29tcHV0ZSBjb25maWRlbmNlIGludGVydmFsIGFyb3VuZCBtZWFuIHVzaW5nIG5vcm1hbCBhcHByb3hpbWF0aW9uCm1lYW5fY2kgPC0gZnVuY3Rpb24oeCwgY29uZiA9IDAuOTUpIHsKICBzZSA8LSBzZCh4KSAvIHNxcnQobGVuZ3RoKHgpKQogIGFscGhhIDwtIDEgLSBjb25mCiAgbWVhbih4KSArIHNlICogcW5vcm0oYyhhbHBoYSAvIDIsIDEgLSBhbHBoYSAvIDIpKQp9Cgp4IDwtIHJ1bmlmKDEwMCkKbWVhbl9jaSh4KQojPiBbMV0gMC40OTggMC42MTAKbWVhbl9jaSh4LCBjb25mID0gMC45OSkKIz4gWzFdIDAuNDgwIDAuNjI4CmBgYAoKIyBDaGVja2luZyB2YWx1ZXMKCmBgYHtyfQp3dF9tZWFuIDwtIGZ1bmN0aW9uKHgsIHcpIHsKICBzdW0oeCAqIHcpIC8gc3VtKHcpCn0Kd3RfdmFyIDwtIGZ1bmN0aW9uKHgsIHcpIHsKICBtdSA8LSB3dF9tZWFuKHgsIHcpCiAgc3VtKHcgKiAoeCAtIG11KSBeIDIpIC8gc3VtKHcpCn0Kd3Rfc2QgPC0gZnVuY3Rpb24oeCwgdykgewogIHNxcnQod3RfdmFyKHgsIHcpKQp9Cgp3dF9tZWFuKDE6NiwgMTozKQpgYGAKCgpgYGB7cn0Kd3RfbWVhbiA8LSBmdW5jdGlvbih4LCB3KSB7CiAgaWYgKGxlbmd0aCh4KSAhPSBsZW5ndGgodykpIHsKICAgIHN0b3AoImB4YCBhbmQgYHdgIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoIiwgY2FsbC4gPSBGQUxTRSkKICB9CiAgc3VtKHcgKiB4KSAvIHN1bSh3KQp9CmBgYAoKIyBWZWN0b3JzCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmBgYAoKCmBgYHtyfQp0eXBlb2YobGV0dGVycykKCnR5cGVvZigxOjEwKQpgYGAKCmBgYHtyfQoxOjEwICUlIDMgPT0gMApgYGAKCgpgYGB7cn0KdHlwZW9mKDEpCgp0eXBlb2YoMUwpCmBgYAoKYGBge3J9CnNhbXBsZSgxMCkgKyAxMDAKCnJ1bmlmKDEwKSA+IDAuNQpgYGAKCgpgYGB7cn0KdGliYmxlKHggPSAxOjQsIHkgPSByZXAoMToyLCAyKSkKCnRpYmJsZSh4ID0gMTo0LCB5ID0gcmVwKDE6MiwgZWFjaCA9IDIpKQpgYGAKCgpgYGB7cn0KeF9uYW1lZCA8LSBsaXN0KGEgPSAxLCBiID0gMiwgYyA9IDMpCnN0cih4X25hbWVkKQpgYGAKCgpgYGB7cn0KeDEgPC0gbGlzdChjKDEsIDIpLCBjKDMsIDQpKQp4MiA8LSBsaXN0KGxpc3QoMSwgMiksIGxpc3QoMywgNCkpCngzIDwtIGxpc3QoMSwgbGlzdCgyLCBsaXN0KDMpKSkKYGBgCgoKIVtdKGh0dHA6Ly9yNGRzLmhhZC5jby5uei9kaWFncmFtcy9saXN0cy1zdHJ1Y3R1cmUucG5nKQoKIyBTdWJzZXR0aW5nCgpgYGB7cn0KYSA8LSBsaXN0KGEgPSAxOjMsIGIgPSAiYSBzdHJpbmciLCBjID0gcGksIGQgPSBsaXN0KC0xLCAtNSkpCmBgYAoKIVtdKGh0dHA6Ly9yNGRzLmhhZC5jby5uei9kaWFncmFtcy9saXN0cy1zdWJzZXR0aW5nLnBuZykKCgojIEZ1bmN0aW9ucwoKYGBge3J9CmZsaXAgPC0gZnVuY3Rpb24oKSBzYW1wbGUoYygiVCIsICJIIiksIDEpCgpmbGlwcyA8LSAwCm5oZWFkcyA8LSAwCgp3aGlsZSAobmhlYWRzIDwgMykgewogIGlmIChmbGlwKCkgPT0gIkgiKSB7CiAgICBuaGVhZHMgPC0gbmhlYWRzICsgMQogIH0gZWxzZSB7CiAgICBuaGVhZHMgPC0gMAogIH0KICBmbGlwcyA8LSBmbGlwcyArIDEKfQoKZmxpcHMKYGBgCgoKYGBge3J9CmRmIDwtIHRpYmJsZSgKICBhID0gcm5vcm0oMTApLAogIGIgPSBybm9ybSgxMCksCiAgYyA9IHJub3JtKDEwKSwKICBkID0gcm5vcm0oMTApCikKCm1hcF9kYmwoZGYsIG1lYW4pCgptYXBfZGJsKGRmLCBtZWRpYW4pCgptYXBfZGJsKGRmLCBzZCkKCmRmICU+JSBtYXBfZGJsKG1lYW4pCmRmICU+JSBtYXBfZGJsKG1lZGlhbikKZGYgJT4lIG1hcF9kYmwoc2QpCmBgYAoKCmBgYHtyfQptb2RlbHMgPC0gbXRjYXJzICU+JSAKICBzcGxpdCguJGN5bCkgJT4lIAogIG1hcChmdW5jdGlvbihkZikgbG0obXBnIH4gd3QsIGRhdGEgPSBkZikpCmBgYAoKYGBge3J9Cm1vZGVscyA8LSBtdGNhcnMgJT4lIAogIHNwbGl0KC4kY3lsKSAlPiUgCiAgbWFwKH5sbShtcGcgfiB3dCwgZGF0YSA9IC4pKQpgYGAKCmBgYHtyfQptb2RlbHMgJT4lIAogIG1hcChzdW1tYXJ5KSAlPiUgCiAgbWFwX2RibCh+LiRyLnNxdWFyZWQpCmBgYAoK