Заглавная буква первого слова обоих слов в строке из двух слов


предположим, что у меня есть строка из двух слов, и я хочу, чтобы заглавные буквы оба.

name <- c("zip code", "state", "final count")

The Hmisc пакет имеет функцию capitalize с заглавной буквы первого слова, но я не уверен как получить второе слово с заглавной буквы. Страница справки для capitalize не предполагает, что он может выполнить эту задачу.

library(Hmisc)
capitalize(name)
# [1] "Zip code"    "State"       "Final count"

Я хочу сделать:

c("Zip Code", "State", "Final Count")

а как насчет строк из трех слов:

name2 <- c("I like pizza")
11 140

11 ответов:

базовая функция 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" 

Edit это работает для любой строки, независимо от количества слов:

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

соответствует регулярному выражению, которое начинается с начала ^ или через пробел [[:space:]] и буквы [[:alpha:]]. Глобально (g в gsub) замените все такие вхождения совпадающим началом или пробелом и прописной версией совпадающего алфавитного символа,\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 это "Zip",\2 это "код"\U\2 это "код", и \1\U\2 - это "индекс".

The ?regexp страница полезна для понимания регулярных выражения, ?gsub для объединения вещей.

есть встроенный решение 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"

используйте эту функцию из 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"

альтернатива:

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

попробуй:

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"

пакета 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!"

альтернативный способ с подстрокой и regexpr:

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

вы также можете использовать пакет snakecase:

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

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

https://github.com/Tazinho/snakecase

это дает заглавные буквы для всех основных слов

library(lettercase)
xString = str_title_case(xString)