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

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

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

Ответ 1

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

Ответ 2

Сопоставьте регулярное выражение, начинающееся с начала ^ или после пробела [[: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 - "Почтовый индекс".

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

Ответ 3

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

Ответ 4

В заголовке также есть встроенное решение 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"

Ответ 5

Try:

require(Hmisc)
sapply(name, function(x) {
  paste(sapply(strsplit(x, ' '), capitalize), collapse=' ')
})

Ответ 6

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

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

Ответ 7

На странице справки для ?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"

Ответ 8

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

Ответ 9

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

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

Ответ 10

> require(stringr)
Loading required package: stringr
> str_to_title('the state of the union')
[1] "The State Of The Union"

Ответ 11

Незначительное изменение в ответах 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 в начале вашего script.

Я нашел это небольшое изменение более читабельным и элегантным при использовании его в конвейере и разных переменных.

Ответ 12

Вы также можете использовать пакет snakecase (который внутренне обертывает также предлагаемое решение stringi/stringr):

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

https://github.com/Tazinho/snakecase