Search code examples
rdplyrtidyverseacross

Subtract and divide using one mutate_across function in dplyr


I have a data set that looks like the iris data set.

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

I would like across Sepal.Length:Petal.Width to subtract each value with the number 2 and then divide the outcome by 4. How can I do this in one line with mutate_across in dplyr instead of two?

iris %>% 
  mutate(across(c(Sepal.Length:Petal.Width), ~. -2 )) %>% 
  mutate(across(c(Sepal.Length:Petal.Width), ~. /4 )) 

Solution

  • library(dplyr, warn.conflicts = F)
    iris %>%
      mutate(across(1:4, ~  (. - 2)/4))
    #>     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
    #> 1          0.775       0.375       -0.150      -0.450     setosa
    #> 2          0.725       0.250       -0.150      -0.450     setosa
    #> 3          0.675       0.300       -0.175      -0.450     setosa
    #> 4          0.650       0.275       -0.125      -0.450     setosa
    #> 5          0.750       0.400       -0.150      -0.450     setosa
    #> 6          0.850       0.475       -0.075      -0.400     setosa
    #> 7          0.650       0.350       -0.150      -0.425     setosa
    #> 8          0.750       0.350       -0.125      -0.450     setosa
    #> 9          0.600       0.225       -0.150      -0.450     setosa
    #> 10         0.725       0.275       -0.125      -0.475     setosa
    .
    .
    
    

    Created on 2021-07-06 by the reprex package (v2.0.0)