dplyr mutate rowSums calculations or custom functions

Solution 1:

This is more of a workaround but could be used

iris %>% mutate(sumVar = rowSums(.[1:4]))

As written in comments, you can also use a select inside of mutate to get the columns you want to sum up, for example

iris %>% 
  mutate(sumVar = rowSums(select(., contains("Sepal")))) %>% 
  head 

or

iris %>% 
  mutate(sumVar = select(., contains("Sepal")) %>% rowSums()) %>% 
  head

Solution 2:

You can use rowwise() function:

iris %>% 
  rowwise() %>% 
  mutate(sumVar = sum(c_across(Sepal.Length:Petal.Width)))

#> # A tibble: 150 x 6
#> # Rowwise: 
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species sumVar
#>           <dbl>       <dbl>        <dbl>       <dbl> <fct>    <dbl>
#>  1          5.1         3.5          1.4         0.2 setosa    10.2
#>  2          4.9         3            1.4         0.2 setosa     9.5
#>  3          4.7         3.2          1.3         0.2 setosa     9.4
#>  4          4.6         3.1          1.5         0.2 setosa     9.4
#>  5          5           3.6          1.4         0.2 setosa    10.2
#>  6          5.4         3.9          1.7         0.4 setosa    11.4
#>  7          4.6         3.4          1.4         0.3 setosa     9.7
#>  8          5           3.4          1.5         0.2 setosa    10.1
#>  9          4.4         2.9          1.4         0.2 setosa     8.9
#> 10          4.9         3.1          1.5         0.1 setosa     9.6
#> # ... with 140 more rows

"c_across() uses tidy selection syntax so you can to succinctly select many variables"'

Finally, if you want, you can use %>% ungroup at the end to exit from rowwise.

Solution 3:

A more complicated way would be:

 iris %>% select(Sepal.Length:Petal.Width) %>%
mutate(sumVar = rowSums(.)) %>% left_join(iris)

Solution 4:

Adding @docendodiscimus's comment as an answer. +1 to him!

iris %>% mutate(sumVar = rowSums(select(., contains("Sepal"))))

Solution 5:

I am using this simple solution, which is a more robust modification of the answer by Davide Passaretti:

iris %>% select(Sepal.Length:Petal.Width) %>%
  transmute(sumVar = rowSums(.)) %>% bind_cols(iris, .)

(But it requires a defined row order, which should be fine, unless you work with remote datasets perhaps..)