MilesMcBain · GitHub

As a simple example, let's say you have a normalising constant in one dataframe column and you need to normalise many other columns. mutate_at seems like it would be convenient to do this, but you can't refer to other columns in the dataframe apart from . cleanly.

Example:

library(tidyverse)
## Works but hardcoding dataset name feels lame.
iris %>%
  mutate_at(vars(starts_with("Sepal")),
            ~ . / iris$Petal.Width) %>%
  head()
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1         25.5       17.50          1.4         0.2  setosa
#> 2         24.5       15.00          1.4         0.2  setosa
#> 3         23.5       16.00          1.3         0.2  setosa
#> 4         23.0       15.50          1.5         0.2  setosa
#> 5         25.0       18.00          1.4         0.2  setosa
#> 6         13.5        9.75          1.7         0.4  setosa
## Fails
iris %>%
  mutate_at(vars(starts_with("Sepal")),
            ~ . / Petal.Width) %>%
  head()
#> Error in mutate_impl(.data, dots): Evaluation error: object 'Petal.Width' not found.
## Fails differently
iris %>%
  mutate_at(vars(starts_with("Sepal")),
            ~ . / .data$Petal.Width) %>%
  head()
#> Error in mutate_impl(.data, dots): Column `Sepal.Length` must be length 150 (the number of rows) or one, not 0

Created on 2019-02-15 by the reprex package (v0.2.1)

Read the original on github.com ↗