如何在R中将not.camel.case转换为CamelCase

时间:2012-07-26 14:53:18

标签: r camelcasing

在R中,我想转换

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

'ThisText' 'NextText'

我试过了

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

但是这给了我

"thisext" "nextext"

因为在这段时间之后它不会取代这封信。

可能很容易,但我无法解决。

5 个答案:

答案 0 :(得分:20)

或者基于正则表达式的解决方案:

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),唯一的区别是第一个字符不是匹配的,而是每个.

答案 1 :(得分:16)

这是一种方法,但正则表达式可能更好:

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"

编辑: 作为一个好奇心,我微观标记了4个答案(TOM =原始海报,TR =我自己,JMS = jmsigner&amp; 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 :(得分:9)

来自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

答案 3 :(得分:8)

实际上我认为我刚从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 :(得分:2)

这是另一个通过snakecase包的解决方案:

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

to_upper_camel_case(t1)
#> [1] "ThisText" "NextText"

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