Reputation: 4122
Is it possible to set all column names to upper or lower within a dplyr or magrittr chain?
In the example below I load the data and then, using a magrittr pipe, chain it through to my dplyr mutations. In the 4th line I use the tolower
function , but this is for a different purpose: to create a new variable with lowercase observations.
mydata <- read.csv('myfile.csv') %>%
mutate(Year = mdy_hms(DATE),
Reference = (REFNUM),
Event = tolower(EVENT)
I'm obviously looking for something like colnames = tolower
but know this doesn't work/exist.
I note the dplyr rename
function but this isn't really helpful.
In magrittr the colname options are:
set_colnames
instead of base R's colnames<-
set_names
instead of base R's names<-
I've tried numerous permutations with these but no dice.
Obviously this is very simple in base r.
names(mydata) <- tolower(names(mydata))
However it seems incongruous with the dplyr/magrittr philosophies that you'd have to do that as a clunky one liner, before moving on to an elegant chain of dplyr/magrittr code.
Upvotes: 31
Views: 20588
Reputation: 47310
with {dplyr} we can do :
mydata %>% rename_with(tolower)
rename_all()
can be used for the same effect but has been superseded.
Upvotes: 72
Reputation: 5779
You could also define a function:
upcase <- function(df) {
names(df) <- toupper(names(df))
df
}
library(dplyr)
mtcars %>% upcase %>% select(MPG)
Upvotes: 2
Reputation: 728
mtcars %>%
set_colnames(value = casefold(colnames(.), upper = FALSE)) %>%
head
casefold
is available in base R and can convert in both direction, i.e. can convert to either all upper case or all lower case by using the flag upper
, as need might be.
Also colnames()
will use only column headers for case conversion.
Upvotes: 2
Reputation: 379
Using magrittr
's "compound assignment pipe-operator" %<>%
might be, if I understand your question correctly, an even more succinct option.
library("magrittr")
names(iris) %<>% tolower
?`%<>%` # for more
Upvotes: 21
Reputation: 52637
iris %>% setNames(tolower(names(.))) %>% head
Or equivalently use replacement function in non-replacement form:
iris %>% `names<-`(tolower(names(.))) %>% head
iris %>% `colnames<-`(tolower(names(.))) %>% head # if you really want to use `colnames<-`
Upvotes: 25