RDJ
RDJ

Reputation: 4122

Dplyr or Magrittr - tolower?

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 / 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

Answers (5)

moodymudskipper
moodymudskipper

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

Carl
Carl

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

Frash
Frash

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

Kevin
Kevin

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

BrodieG
BrodieG

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

Related Questions