Max Ghenis
Max Ghenis

Reputation: 15813

How to convert CamelCase to not.camel.case in R

In R, I'd like to convert

c("ThisText", "NextText")

to

c("this.text", "next.text")

This is the reverse of this SO question, and the same as this one but with dots in R rather than underscores in PHP.

Upvotes: 9

Views: 2946

Answers (4)

Jeremy
Jeremy

Reputation: 11

Using stringr

x <- c("ThisText", "NextText")

str_replace_all(string = x,
                pattern = "(?<=[a-z0-9])(?=[A-Z])",
                replacement = ".") %>%
    str_to_lower()

OR

x <- c("ThisText", "NextText")

str_to_lower(
    str_replace_all(string = x,
                    pattern = "(?<=[a-z0-9])(?=[A-Z])",
                    replacement = ".")
)

Upvotes: 1

Taz
Taz

Reputation: 556

You could do this also via the snakecase package:

install.packages("snakecase")
library(snakecase)

to_snake_case(c("ThisText", "NextText"), sep_out = ".")
# [1] "this.text" "next.text"

Github link to package: https://github.com/Tazinho/snakecase

Upvotes: 13

G. Grothendieck
G. Grothendieck

Reputation: 269694

Not clear what the entire set of rules is here but we have assumed that

  • we should lower case any upper case character after a lower case one and insert a dot between them and also
  • lower case the first character of the string if succeeded by a lower case character.

To do this we can use perl regular expressions with sub and gsub:

# test data
camelCase <-  c("ThisText", "NextText", "DON'T_CHANGE")


s <- gsub("([a-z])([A-Z])", "\\1.\\L\\2", camelCase, perl = TRUE)
sub("^(.[a-z])", "\\L\\1", s, perl = TRUE) # make 1st char lower case

giving:

[1] "this.text"    "next.text"    "DON'T_CHANGE"

Upvotes: 14

James
James

Reputation: 66844

You can replace all capitals with themselves and a preceeding dot with gsub, change everything tolower, and the substr out the initial dot:

x <- c("ThisText", "NextText", "LongerCamelCaseText")

substr(tolower(gsub("([A-Z])","\\.\\1",x)),2,.Machine$integer.max)
[1] "this.text"              "next.text"              "longer.camel.case.text"

Upvotes: 5

Related Questions