将两个单词的字符串中两个单词的首字母大写


174

假设我有两个单词的字符串,并且我想将两者都大写。

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")

Answers:


172

执行大写的基本R函数为toupper(x)。从帮助文件中可以找到?toupper您需要的功能:

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" 

编辑这适用于任何字符串,与字数无关:

simpleCap("I like pizza a lot")
[1] "I Like Pizza A Lot"

11
并且,如果这对其他人有帮助,请记住,将tolower函数放入您的simpleCap函数中,您也可以处理所有加盖的单词:您可以处理以下代码:<br/> name <-c(“ george wasHINgton”,“ tom jefferson “,” ABE LINCOLN“)simpleCap <-function(x){s <-tolower(x)s <-strsplit(s,”“)[[1]] paste(toupper(substring(s,1,1)) ,substring(s,2),sep =“”,collapse =“”)} sapply(name,simpleCap)
MatthewR 2014年

连字符呢?像Smith-Jones或Al-Rayon,可以输入SMITH-JONES或al-rayon。
Hack-R

1
您可以使用paste0()代替paste(..., sep="")。简而言之。
MERose

3
@merose正确,但在这种情况下paste0 ()不适用,因为不接受collapse = ...论点
Andrie

3
@Andrie仍然正确吗?paste0(c("a", "b"), collapse = ",")对我来说很好。也许这是最近的功能?
MichaelChirico

156

还有一个用于标题大小写的内置base-R解决方案

tools::toTitleCase("demonstrating the title case")
## [1] "Demonstrating the Title Case"

要么

library(tools)
toTitleCase("demonstrating the title case")
## [1] "Demonstrating the Title Case"

3
仔细研究了源代码后,它表明该函数尝试通过使所有单词都以大写字母开头(除了英语)(最可能的例外)(例如c("all", "above", "after", "along", "also", "among", "any", "both", "can", "few", "it", "less", "log", "many", "may", "more", "over", "some", "their", "then", "this", "under", "until", "using", "von", "when", "where", "which", "will", "without", "yet", "you", "your")),以尝试实现标题大小写(这不是所有单词都以大写字母开头)。
petermeissner '16

15
如果您只期望首字母大写,您可能会感到惊讶。 tools::toTitleCase("HELLO")结果HELLO。您可能需要tolower先将其包装起来,这样:tools::toTitleCase(tolower("HELLO"))它返回Hello
ddunn801

2
好点子-到目前为止,它仍然是标题案例中最有趣的部分
petermeissner

谢谢!此解决方案适用于大多数情况,除非有美国各州的缩写
Tung

97

匹配正则表达式,该正则表达式从^空格的开头或之后开始,[[:space:]]后跟字母字符[[:alpha:]]。全局(gsub中的g)将所有此类匹配项替换为匹配的开头或空格以及匹配的字母字符大写形式\\1\\U\\2。这必须通过perl样式的正则表达式匹配来完成。

gsub("(^|[[:space:]])([[:alpha:]])", "\\1\\U\\2", name, perl=TRUE)
# [1] "Zip Code"    "State"       "Final Count"

在的更详细的替换参数中gsub()\\1说“使用x匹配第一个子表达式的部分”,即x匹配的部分(^|[[:spacde:]])。同样,\\2说使用x匹配第二个子表达式的部分([[:alpha:]])。的\\U是使用支持语法perl=TRUE和手段,使下一个字符大写。因此,对于“邮政编码”,\\1为“邮政编码”,\\2为“代码”,\\U\\2为“代码”,\\1\\U\\2为“邮政编码”。

?regexp页面有助于理解正则表达式,?gsub将内容组合在一起。


12
呸!我本来是走这条路的,但是错误地使用\\u并放弃了,然后才意识到我应该将其资本化……有点讽刺意味。这是我想出的,没有经过彻底检查的奇怪球盒gsub(pattern = "\\b([a-z])", replacement = "\\U\\1", name, perl = TRUE)
Chase

我试图在行名上使用它,但是它只能工作一次,但我无法重复。
dpel

对作品tolower(name)是否有其他帽
MichaelChirico

83

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"

24
字符串包(如果您是tidyverse的话)将包裹stri_tans_totitle到名为的函数中str_to_title()。它只是底层的stringi :: stri_trans_totitle(),但可能会节省加载另一个库(实际上,您可能已经加载了),具体取决于您的工作流程。
crazybilly

49

选择:

library(stringr)
a = c("capitalise this", "and this")
a
[1] "capitalise this" "and this"       
str_to_title(a)
[1] "Capitalise This" "And This"   

要求更严格的答案!谢谢!
Neal Barsch


16

从帮助页面?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"

9

该软件包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!"

6

子字符串和regexpr的另一种方法:

substring(name, 1) <- toupper(substring(name, 1, 1))
pos <- regexpr(" ", name, perl=TRUE) + 1
substring(name, pos) <- toupper(substring(name, pos, pos))

4

您还可以使用snakecase软件包:

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

name <- c("zip code", "state", "final count")
to_title_case(name)
#> [1] "Zip Code"    "State"       "Final Count"

# or 
to_upper_camel_case(name, sep_out = " ")
#> [1] "Zip Code"    "State"       "Final Count"

https://github.com/Tazinho/snakecase


2

这使所有主要单词都使用大写字母

library(lettercase)
xString = str_title_case(xString)

效果不理想> lettercase::str_title_case("HEY HELLO") [1] "HEY HELLO"
Tung

是的,我建议先使用tolower(x)。我在说“所有主要单词”时也犯了一个错误。此功能适用于所有单词。
科尔·戴维斯

另一种选择:library(Hmisc)#大写功能
Cole Davis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.