将两个单词的第一个字母大写为两个单词的字符串

ATM*_*hew 165 string title-case r

假设我有一个两个单词的字符串,我想把它们都大写.

name <- c("zip code", "state", "final count")
Run Code Online (Sandbox Code Playgroud)

这个Hmisc包有一个capitalize大写第一个单词的函数,但我不确定如何将第二个单词大写.帮助页面capitalize并不表示它可以执行该任务.

library(Hmisc)
capitalize(name)
# [1] "Zip code"    "State"       "Final count"
Run Code Online (Sandbox Code Playgroud)

我想得到:

c("Zip Code", "State", "Final Count")
Run Code Online (Sandbox Code Playgroud)

三字串怎么样:

name2 <- c("I like pizza")
Run Code Online (Sandbox Code Playgroud)

And*_*rie 161

执行大写的基本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" 
Run Code Online (Sandbox Code Playgroud)

编辑适用于任何字符串,无论字数如何:

simpleCap("I like pizza a lot")
[1] "I Like Pizza A Lot"
Run Code Online (Sandbox Code Playgroud)

  • 如果这对其他人有帮助,请记住将tolower函数放在simpleCap函数中,你也可以处理所有上限的单词:你可以处理的代码:<br/>名称< - 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) (11认同)
  • @merose正确,但不是在这种情况下,因为`paste0()`不接受`collapse = ...`参数 (3认同)
  • @Andrie那还是正确的吗?`paste0(c("a","b"),collapse =",")`对我来说很好.也许这是最近的一个功能? (3认同)

pet*_*ner 131

标题案例还有一个内置的base-R解决方案:

tools::toTitleCase("demonstrating the title case")
## [1] "Demonstrating the Title Case"
Run Code Online (Sandbox Code Playgroud)

要么

library(tools)
toTitleCase("demonstrating the title case")
## [1] "Demonstrating the Title Case"
Run Code Online (Sandbox Code Playgroud)

  • 如果您只希望将首字母大写,您可能会感到惊讶.`tools :: toTitleCase("HELLO")`导致`HELLO`.你可能想首先将它包装在`tolower`中,如下所示:`tools :: toTitleCase(tolower("HELLO"))`返回`Hello` (7认同)
  • 这应该是公认的解决方案 (4认同)
  • 稍微查看了源代码,它显示函数试图通过使用大写字母开始所有单词除了一组英语最可能的异常(例如`之外)来尝试实现标题大小写(除了所有单词以大写字母开头之外的其他内容). c("all","above","after","along","also","between","any","both","can","few","it","less", "log","many","may","more","over","some","their","then","this","under","until","using","von ","当","何处",",","将","没有","还","你","你的")`) (3认同)
  • 好的 ppint - 仍然是目前为止您可以获得的标题大小写 (2认同)

Mar*_*gan 94

匹配从开头^或开头后开始的正则表达式,[[:space:]]后面跟一个字母字符[[:alpha:]].全局(gsub中的g)用匹配的开头或空格以及匹配的字母字符的大写版本替换所有这些出现\\1\\U\\2.这必须使用perl风格的正则表达式匹配来完成.

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

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

?regexp页面有助于理解正则表达式,?gsub将事物放在一起.

  • 呸!我最初走的是这条道路,但是错误地使用了`\\ u`并放弃了,然后才意识到我应该将它资本化......有点讽刺.这是我提出的,没有彻底审查奇怪的球案例`gsub(pattern ="\\ b([az])",replacement ="\\ U \\ 1",name,perl = TRUE) (11认同)

bar*_*nus 81

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"
Run Code Online (Sandbox Code Playgroud)

  • stringr包(如果tidyverse是你的东西)将`stri_tans_totitle`包装到一个名为`str_to_title()`的函数中.它只是封面下的stringi :: stri_trans_totitle(),但可能会保存加载另一个库(实际上,您可能已加载),具体取决于您的工作流程. (22认同)
  • `str_to_title()` 函数做了意想不到的事情。例如,它将 McEwan 这个名字变成了 Mcewan。 (3认同)

Bri*_*esh 41

替代方案:

library(stringr)
a = c("capitalise this", "and this")
a
[1] "capitalise this" "and this"       
str_to_title(a)
[1] "Capitalise This" "And This"   
Run Code Online (Sandbox Code Playgroud)


dil*_*iop 21

尝试:

require(Hmisc)
sapply(name, function(x) {
  paste(sapply(strsplit(x, ' '), capitalize), collapse=' ')
})
Run Code Online (Sandbox Code Playgroud)

  • @AndreHolzner或者相反.`Hmisc`比`plyr`有点旧... (2认同)

Cha*_*ase 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"
Run Code Online (Sandbox Code Playgroud)


Dir*_*irk 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!"
Run Code Online (Sandbox Code Playgroud)


gre*_*g L 6

使用substring和regexpr的替代方法:

substring(name, 1) <- toupper(substring(name, 1, 1))
pos <- regexpr(" ", name, perl=TRUE) + 1
substring(name, pos) <- toupper(substring(name, pos, pos))
Run Code Online (Sandbox Code Playgroud)


Taz*_*Taz 5

你也可以使用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"
Run Code Online (Sandbox Code Playgroud)

https://github.com/Tazinho/snakecase