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

Posted

技术标签:

【中文标题】如何在 R 中将 not.camel.case 转换为 CamelCase【英文标题】:How to convert not.camel.case to CamelCase in R 【发布时间】:2012-07-25 04:51:03 【问题描述】:

在R中,我想转换

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

'ThisText' 'NextText'

我试过了

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

但这给了我

"thisext" "nextext"

因为它不会替换句点后的字母。

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

【问题讨论】:

请用下面的实际答案回答您的问题,而不是将其编辑到您的问题中。 【参考方案1】:

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

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 我可以要求进行一些小编辑,为未来的搜索者解释一下您的正则表达式的魔力吗? 谢谢你,我添加了一些解释,希望这样更容易理解。 另外,如果您使用前瞻断言,您可以在一行中完成:gsub("(?:(?=\\b)|\\.)([[:alpha:]])", "\\U\\1", t1, perl=TRUE) 实际上,我的可以进一步简化为不需要前瞻:gsub("(?:\\b|\\.)([[:alpha:]])", "\\U\\1", t1, perl=TRUE)。可悲的是,@TylerRinker,速度提升可以忽略不计。【参考方案2】:

这是一种方法,但使用正则表达式可能会有更好的方法:

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=original poster,TR=myself,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

【讨论】:

关于如何做反向(camel -> dot)的任何建议? 我会问这是一个新问题,因为在 cmets 中发布问题不适合 SO。 有道理,这里是:***.com/questions/22528625/…【参考方案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"  

【讨论】:

提示:你可能想Vectorize()这个函数。【参考方案4】:

tocamel from 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

【讨论】:

有趣的是,函数 tocamel 没有在其名称中使用驼峰式【参考方案5】:

这里是通过蛇形包的另一种解决方案:

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

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

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

【讨论】:

【参考方案6】:

janitor 包中的make_clean_names() 函数有一个可以用于此的函数。

在你的情况下:

t1 <- c('this.text', 'next.text')
janitor::make_clean_names(t1, case = "big_camel")
#> [1] "ThisText" "NextText"

参数case可以是多个之一:

“snake”, “small_camel”, “big_camel”, “screaming_snake”, “parsed”, “mixed”, “lower_upper”, “upper_lower”, “swap”, “all_caps”, “lower_camel”, “upper_camel”, “internal_parsing”, “none”, “flip”, “sentence”, “random”, “title”

由reprex package (v2.0.1) 于 2021-10-13 创建

【讨论】:

以上是关于如何在 R 中将 not.camel.case 转换为 CamelCase的主要内容,如果未能解决你的问题,请参考以下文章

如何在R中将highchart保存为PNG图像?

如何在EXCEL中将字符转成日期 如19970828转成1997-08-28

如何在 R 中将时间格式从 1730 更改为 17:30:00?

如何在 R 中将数值数据转换为货币?

在 iOS 11 LargeTitles 中将单行标题转换为多行标题时如何去除跳转效果

如何在 64 位窗口中将 R 与 Access 数据库连接?