用两个字的string大写两个单词的首字母
假设我有两个字的string,我想把它们两个都大写。
name <- c("zip code", "state", "final count")
Hmisc
包中有一个capitalize
大写的函数,但我不确定如何得到大写的第二个单词。 capitalize
的帮助页面并不意味着它可以执行该任务。
library(Hmisc) capitalize(name) # [1] "Zip code" "State" "Final count"
我想得到:
c("Zip Code", "State", "Final Count")
三字串的情况如何:
name2 <- c("I like pizza")
执行大写的基本R函数是toupper(x)
。 从?toupper
的帮助文件中,有这个function可以完成你所需要的function:
simpleCap <- function(x) { s <- strsplit(x, " ")[[1]] paste(toupper(substring(s, 1,1)), substring(s, 2), sep="", collapse=" ") } name <- c("zip code", "state", "final count") sapply(name, simpleCap) zip code state final count "Zip Code" "State" "Final Count"
编辑这适用于任何string,无论字数:
simpleCap("I like pizza a lot") [1] "I Like Pizza A Lot"
匹配一个正则expression式,该expression式从开始^
或之后的空格[[:space:]]
,后跟一个字母字符[[:alpha:]]
。 在全球范围内(g中的g)用匹配的开始或空格和匹配的字母字符的大写版本replace所有这样的事件, \\1\\U\\2
。 这必须用Perl风格的正则expression式匹配来完成。
gsub("(^|[[:space:]])([[:alpha:]])", "\\1\\U\\2", name, perl=TRUE) # [1] "Zip Code" "State" "Final Count"
在replace参数gsub()
的一些细节中, \\1
表示“使用匹配第一个子expression式的x
的部分”,即x
匹配的部分(^|[[:spacde:]])
。 同样, \\2
表示使用匹配第二个子expression式([[:alpha:]])
的x
部分。 \\U
是通过使用perl=TRUE
启用的语法,并且意味着使下一个字符成为大写。 因此,对于“邮政编码”, \\1
是“邮政编码”, \\2
是“代码”, \\U\\2
是“代码”,和\\1\\U\\2
是“邮政编码”。
?regexp
页面有助于理解正则expression式, ?gsub
将所有东西放在一起。
使用stringi
包中的这个函数
stri_trans_totitle(c("zip code", "state", "final count")) ## [1] "Zip Code" "State" "Final Count" stri_trans_totitle("i like pizza very much") ## [1] "I Like Pizza Very Much"
标题案例还有一个内置的base-R解决scheme :
tools::toTitleCase("demonstrating the title case") ## [1] "Demonstrating the Title Case"
要么
library(tools) toTitleCase("demonstrating the title case") ## [1] "Demonstrating the Title Case"
尝试:
require(Hmisc) sapply(name, function(x) { paste(sapply(strsplit(x, ' '), capitalize), collapse=' ') })
从?toupper
的帮助页面:
.simpleCap <- function(x) { s <- strsplit(x, " ")[[1]] paste(toupper(substring(s, 1,1)), substring(s, 2), sep="", collapse=" ") } > sapply(name, .simpleCap) zip code state final count "Zip Code" "State" "Final Count"
替代scheme:
library(stringr) a = c("capitalise this", "and this") a [1] "capitalise this" "and this" str_to_title(a) [1] "Capitalise This" "And This"
包BBmisc
现在包含函数capitalizeStrings
。
library("BBmisc") capitalizeStrings(c("the taIl", "wags The dOg", "That Looks fuNny!") , all.words = TRUE, lower.back = TRUE) [1] "The Tail" "Wags The Dog" "That Looks Funny!"
子string和正则expression式的替代方法:
substring(name, 1) <- toupper(substring(name, 1, 1)) pos <- regexpr(" ", name, perl=TRUE) + 1 substring(name, pos) <- toupper(substring(name, pos, pos))
> require(stringr) Loading required package: stringr > str_to_title('the state of the union') [1] "The State Of The Union"
轻微更改为simpleCap
和.simpleCap
答案:
simpleCap <- function(x) { s <- strsplit(x, " ") # Remove [[1]] sapply(s, function(x) {paste(toupper(substring(x, 1,1)), substring(x, 2), sep="", collapse=" ")}) # Add sapply into function }
我用map_chr
而不是sapply
如果你不介意在脚本开始加载tidyverse
。
在stream水线和不同variables中使用它时,我发现这个小小的变化更具可读性和优雅性。
你也可以使用snakecase包(内部包装也是build议的stringi / stringr解决scheme):
> install.packages("snakecase") > library(snakecase) > name <- c("zip code", "state", "final count") > to_any_case(name, case = "big_camel", postprocess = " ") [1] "Zip Code" "State" "Final Count"