Как преобразовать not.camel.case в CamelCase в R
В R, я хочу преобразовать
t1 <- c('this.text', 'next.text')
"this.text" "next.text"
к
'ThisText' 'NextText'
Я пробовал
gsub('\\..', '', t1)
Но это дает мне
"thisext" "nextext"
поскольку он не заменяет букву после периода.
Наверное, очень легко, но я не могу это решить.
Ответы
Ответ 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