Подтвердить что ты не робот

Как преобразовать not.camel.case в CamelCase в R

В R, я хочу преобразовать

t1 <- c('this.text', 'next.text')
"this.text" "next.text"

к

'ThisText' 'NextText'

Я пробовал

gsub('\\..', '', t1)

Но это дает мне

"thisext" "nextext"

поскольку он не заменяет букву после периода.

Наверное, очень легко, но я не могу это решить.

4b9b3361

Ответ 1

Здесь один подход, но с регулярным выражением, вероятно, лучшие:

t1 <- c('this.text', 'next.text')

camel <- function(x){ #function for camel case
    capit <- function(x) paste0(toupper(substring(x, 1, 1)), substring(x, 2, nchar(x)))
    sapply(strsplit(x, "\\."), function(x) paste(capit(x), collapse=""))
}

camel(t1)

Это дает:

> camel(t1)
[1] "ThisText" "NextText"

РЕДАКТИРОВАТЬ: В качестве любопытства я сделал microbenchmarked 4 ответа (TOM = оригинальный плакат, TR = сам, JMS = jmsigner и SB = sebastion, прокомментировал сообщение jmsigner) и нашел ответы без регулярных выражений Быстрее. Я бы предположил, что они медленнее.

   expr     min      lq  median      uq      max
1 JMS() 183.801 188.000 197.796 201.762  349.409
2  SB()  93.767  97.965 101.697 104.963  147.881
3 TOM()  75.107  82.105  85.370  89.102 1539.917
4  TR()  70.442  76.507  79.772  83.037  139.484

enter image description here

Ответ 2

Альтернативно решение на основе регулярного выражения:

t1 <- c('this.text', 'next.text')

# capitalize first letter
t2 <- sub('^(\\w?)', '\\U\\1', t1, perl=T)

# remove points and capitalize following letter
gsub('\\.(\\w?)', '\\U\\1', t2, perl=T)
[1] "ThisText" "NextText"

Изменить: некоторые пояснения

sub('^(\\w?)', '\\U\\1', t1, perl=T), sub здесь достаточно, потому что нас интересует только первое совпадение. Затем первый буквенно-цифровой символ сопоставляется в начале каждой строки с ^(\\w?). Скобки необходимы для обратной ссылки в замещающей части функции. Для замены \\U используется, чтобы загладить все, что приходит после этого (это первый символ).

Тот же принцип применяется в gsub('\\.(\\w?)', '\\U\\1', t2, perl=T) с той лишь разницей, что не соответствует первый символ, но каждый ..

Ответ 3

На самом деле, я думаю, я просто отработал это из файла справки для toupper:

camel <- function(x) {     
     s <- strsplit(x, "\\.")[[1]]     
     paste(toupper(substring(s, 1,1)), substring(s, 2),           
     sep="", collapse="") 
 }    

camel(t1) 
sapply(t1,camel)  
this.text  next.text  
"ThisText" "NextText"  

Ответ 4

tocamel из пакета rapportools делает то, что вы хотите:

> library(rapportools)
> example(tocamel)

tocaml> tocamel("foo.bar")
tocaml>     ## [1] "fooBar"
tocaml> 
tocaml>     tocamel("foo.bar", upper = TRUE)
tocaml>     ## [1] "FooBar"
tocaml> 
tocaml>     tocamel(c("foobar", "foo.bar", "camel_case", "a.b.c.d"))
tocaml>     ## [1] "foobar"    "fooBar"    "camelCase" "aBCD"
tocaml> 

Обновлено:

Другое простое и быстрое решение (например, @rengis):

camel2 <- function(x) {
    gsub("(^|[^[:alnum:]])([[:alnum:]])", "\\U\\2", x, perl = TRUE)
}
camel2(t1)
#> [1] "ThisText" "NextText"

Сравнение с решением @TylerRinker:

identical(camel(t1), camel2(t1))
#> [1] TRUE
microbenchmark::microbenchmark(camel(t1), camel2(t1))
#> Unit: microseconds
#>        expr    min      lq     mean  median      uq     max neval cld
#>   camel(t1) 76.378 79.6520 82.21509 81.5065 82.7095 151.867   100   b
#>  camel2(t1) 15.864 16.9425 19.76000 20.9690 21.9735  38.246   100  a

Ответ 5

Здесь другое решение через пакет snakecase:

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

> to_upper_camel_case(t1, sep_in = "\\.")
[1] "ThisText" "NextText"

Githublink: https://github.com/Tazinho/snakecase