除首个字母外,将句子中的每个单词大写

时间:2020-09-27 10:26:51

标签: r string

除了第一个字母,我想capitalise句子的每个词。这里也有类似的讨论-Capitalize the first letter of both words in a two word string

因此该功能可以用作-

name <- c("zip code", "state", "final count")
simpleCap <- function(x) {
  s <- strsplit(x, " ")[[1]]
  paste(toupper(substring(s, 1,1)), substring(s, 2),
      sep="", collapse=" ")
}
sapply(name, simpleCap)

但是它也将首字母大写。我想要类似"zip Code"的东西,而不是"Zip Code"。有什么办法可以做到这一点?

我们将不胜感激任何帮助。

3 个答案:

答案 0 :(得分:3)

我喜欢使用toTitleCase的链接中的第二个解决方案。您可以使用正则表达式将第一个字符转换为小写。

simpleCap <- function(x) {
  sub('(.)', '\\L\\1', tools::toTitleCase(x), perl = TRUE)
}

simpleCap('Zip Code')
#[1] "zip Code"
simpleCap('this text')
#[1] "this Text"
simpleCap(name)
#[1] "zip Code"    "state"       "final Count"

答案 1 :(得分:2)

或者对strsplit方法稍加修改:

capExceptFirst <- function(x) {
  s <- strsplit(x, " ")[[1]]
  
  paste(
    tolower(s[1]),
    paste(toupper(substring(s[-1], 1,1)), substring(s[-1], 2),
        sep="", collapse=" "),
    collapse = " "
  )
}

sapply(name, capExceptFirst)

输出:

     zip code         state   final count 
   "zip Code"      "state " "final Count" 

答案 2 :(得分:2)

使用一些基本的正则表达式:

name <- c("zip code", "state", "final count")
gsub("\\s([a-z])", " \\U\\1", name, perl = TRUE)
# [1] "zip Code"     "state"        "final Count"

允许使用非ascii字母:

name <- c("zip code", "state", "final count", "uribe álvaro")
gsub("\\s(\\p{L})", " \\U\\1", name, perl = TRUE)
# [1] "zip Code"     "state"        "final Count"  "uribe Álvaro"