My question is how to create a new column which is the sum of some specific columns (selected by their names) in dplyr. For example, with iris dataset, I create a new columns called Petal, which is the sum of Petal.Length and Petal.Width.
iris %>% mutate(Petal = Petal.Length+Petal.Width)
Now imagine I have a dataset with 20 columns with 'Petal' in their names. I want to create a column 'Petal' which sum up all those columns. I definitely do not want to type all the columns names in my code. Feel like there should be achievable with one line of code in dplyr. Appreciate if anyone can help.
I gave a similar answer here and here, but you can use c_across
and rowwise
:
iris %>%
rowwise() %>%
mutate(Petal = sum(c_across(starts_with("Petal")))) %>%
ungroup()
The big advantage is that you can use other functions besides sum
. rowSums
is a better option because it's faster, but if you want to apply another function other than sum
this is a good option.
Also, you can use any of the tidyselect options to select columns by their name, position, class, a range of consecutive columns, etc.
Output
Sepal.Length Sepal.Width Petal.Length Petal.Width Species Petal
<dbl> <dbl> <dbl> <dbl> <fct> <dbl>
1 5.1 3.5 1.4 0.2 setosa 1.6
2 4.9 3 1.4 0.2 setosa 1.6
3 4.7 3.2 1.3 0.2 setosa 1.5
4 4.6 3.1 1.5 0.2 setosa 1.7
5 5 3.6 1.4 0.2 setosa 1.6
6 5.4 3.9 1.7 0.4 setosa 2.1
7 4.6 3.4 1.4 0.3 setosa 1.7
8 5 3.4 1.5 0.2 setosa 1.7
9 4.4 2.9 1.4 0.2 setosa 1.6
10 4.9 3.1 1.5 0.1 setosa 1.6
# ... with 140 more rows
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With