Прописать первую букву обоих слов в строке из двух слов - PullRequest
158 голосов
/ 16 июня 2011

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

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

Ответы [ 11 ]

158 голосов
/ 16 июня 2011

Основная функция 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"
119 голосов
/ 22 июля 2016

Существует встроенное решение 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"
91 голосов
/ 16 июня 2011

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

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

78 голосов
/ 14 марта 2014

Используйте эту функцию из 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"
35 голосов
/ 28 мая 2016

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

library(stringr)
a = c("capitalise this", "and this")
a
[1] "capitalise this" "and this"       
str_to_title(a)
[1] "Capitalise This" "And This"   
21 голосов
/ 16 июня 2011

Попробуйте:

require(Hmisc)
sapply(name, function(x) {
  paste(sapply(strsplit(x, ' '), capitalize), collapse=' ')
})
16 голосов
/ 16 июня 2011

Со страницы справки для ?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 голосов
/ 09 февраля 2015

Пакет 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 голосов
/ 14 января 2015

Альтернативный способ с подстрокой и регулярным выражением:

substring(name, 1) <- toupper(substring(name, 1, 1))
pos <- regexpr(" ", name, perl=TRUE) + 1
substring(name, pos) <- toupper(substring(name, pos, pos))
2 голосов
/ 26 марта 2017

Вы также можете использовать пакет 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

...