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

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")
ATMathew
источник

Ответы:

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"
Andrie
источник
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"
petermeissner
источник
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"
bartektartanus
источник
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"   
Brijesh
источник
Реквизит для струнного ответа! Спасибо!
Нил
21

Пытаться:

require(Hmisc)
sapply(name, function(x) {
  paste(sapply(strsplit(x, ' '), capitalize), collapse=' ')
})
diliop
источник
Обратите внимание , что 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) # использует заглавные буквы
Коул Дэвис,