Заглавная буква первого слова обоих слов в строке из двух слов
предположим, что у меня есть строка из двух слов, и я хочу, чтобы заглавные буквы оба.
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 ответов:
базовая функция 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))