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