dplyr::rename() if condition about column contents is met

Viewed 414

Say I wanted to rename a column based on the condition that the contents of the column contain a specific value.

For example, if iris$Species contains "virginica", rename to Species to flower.name, else keep the name as Species.

This code works:

library(dplyr)
iris <- if("virginica" %in% iris$Species){
  rename(iris, flower.name = Species)
}
iris %>% names

but I was hoping their was a more elegant dplyr way of doing this with one of the existing functions, such as rename_if()?

2 Answers

One option could be:

iris %>%
 rename_with(~ "Flower.Name", 
             .cols = Species & where(~ any(. %in% "virginica")))

    Sepal.Length Sepal.Width Petal.Length Petal.Width Flower.Name
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
7            4.6         3.4          1.4         0.3      setosa
8            5.0         3.4          1.5         0.2      setosa
9            4.4         2.9          1.4         0.2      setosa
10           4.9         3.1          1.5         0.1      setosa

With rename_if

library(dplyr)
iris1 <- iris %>%
      rename_if(~ is.factor(.) && "virginica" %in% ., ~ 'flower.name')
names(iris1)
#[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "flower.name" 
Related