Прописать первую букву обоих слов в строке из двух слов


174

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

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

Ответы:


172

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

11
И если это полезно для других, помните, поместив функцию tolower внутри функции simpleCap, вы также можете работать со всеми ограниченными словами: это код, который вы можете использовать: <br/> name <- c ("george wasHINgton", "tom jefferson" "," ABE LINCOLN ") simpleCap <- function (x) {s <- tolower (x) s <- strsplit (s," ") [[1]] paste (toupper (подстрока (s, 1,1))) , substring (s, 2), sep = "", collapse = "")} sapply (name, simpleCap)
От Матфея

Как насчет дефисных имен? Как Смит-Джонс или Аль-Район, которые можно ввести как Смит-Джонс или Аль-Район.
Hack-R

1
Вы можете использовать paste0()вместо paste(..., sep=""). Просто короче.
MERose

3
@merose Правильно, но не в этом случае, так paste0 ()как не принимает collapse = ...аргумент
Андри

3
@ Андри, это все еще правильно? paste0(c("a", "b"), collapse = ",")у меня отлично работает Возможно, это недавняя особенность?
MichaelChirico

156

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

3
Немного посмотрев на источник, он показывает, что функция пытается получить регистр заглавия (что-то еще, кроме того, что все слова начинаются с заглавной буквы), позволяя начинать все слова с заглавных букв, кроме набора наиболее вероятных исключений на английском языке (например, например c("all", "above", "after", "along", "also", "among", "any", "both", "can", "few", "it", "less", "log", "many", "may", "more", "over", "some", "their", "then", "this", "under", "until", "using", "von", "when", "where", "which", "will", "without", "yet", "you", "your")).
petermeissner

15
Вы можете быть удивлены, если ожидаете, что ТОЛЬКО начальный символ будет написан заглавными буквами. tools::toTitleCase("HELLO")результаты в HELLO. Вы могли бы хотеть обернуть это вокруг tolowerсначала, как так: tools::toTitleCase(tolower("HELLO"))который возвращаетсяHello
ddunn801

2
хороший ppint - до сих пор его заглавные буквы вы можете получить так далеко
petermeissner

Спасибо! Это решение прекрасно работает для большинства случаев, за исключением случаев, когда есть сокращения штатов США
Tung

97

Соответствует регулярному выражению, которое начинается в начале ^или после пробела [[: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это «Zip», \\2«код», \\U\\2«код» и \\1\\U\\2«почтовый индекс»

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


12
бах! Первоначально я пошел по этому пути, но по ошибке использовал \\uи сдался, прежде чем понял, что я должен был использовать его заглавные буквы ... несколько иронично. Вот то, что я придумал, а не тщательно проверял случайные случаи с мячомgsub(pattern = "\\b([a-z])", replacement = "\\U\\1", name, perl = TRUE)
Чейз

Я пытался использовать это в именах строк, и это сработало один раз, но я не мог повторить это.
dpel

Работает над тем tolower(name), есть ли другие заглавные буквы
MichaelChirico

83

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

24
Пакет stringr (если tidyverse - ваша вещь) stri_tans_totitleпревращает его в функцию с именем str_to_title(). Это просто stringi :: stri_trans_totitle () под обложками, но может сохранить загрузку другой библиотеки (которую вы, по сути, уже загрузили), в зависимости от вашего рабочего процесса.
crazybilly

50

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

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

Реквизит для струнного ответа! Спасибо!
Нил

21

Пытаться:

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

Обратите внимание , что Hmiscможет отменить plyr«s summarizeфункция , как указано здесь: stackoverflow.com/a/35324305/288875
Андре Holzner

2
@AndreHolzner Или наоборот. Hmiscнемного старше, чем plyr...
Joris

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"

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

6

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

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

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"

https://github.com/Tazinho/snakecase


2

Это дает заглавные буквы всем основным словам

library(lettercase)
xString = str_title_case(xString)

Не работает идеально> lettercase::str_title_case("HEY HELLO") [1] "HEY HELLO"
Tung

Да, я бы предложил сначала использовать tolower (x). Также я допустил ошибку, сказав «все основные слова»; эта функция работает на всех словах.
Коул Дэвис

Другой вариант: библиотека (Hmisc) # использует заглавные буквы
Коул Дэвис,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.