Capitalice la primera letra de ambas palabras en una cadena de dos palabras
-
28-10-2019 - |
Pregunta
Digamos que tengo una cadena de dos palabras y quiero capitalizarlos.
name <- c("zip code", "state", "final count")
los Hmisc
El paquete tiene una función capitalize
que capitalizó la primera palabra, pero no estoy seguro de cómo aprovechar la segunda palabra. La página de ayuda para capitalize
No sugiere que pueda realizar esa tarea.
library(Hmisc)
capitalize(name)
# [1] "Zip code" "State" "Final count"
Quiero tener:
c("Zip Code", "State", "Final Count")
¿Qué pasa con las cuerdas de tres palabras?
name2 <- c("I like pizza")
Solución
La función base R para realizar la capitalización es toupper(x)
. Desde el archivo de ayuda para ?toupper
Existe esta función que hace lo que necesita:
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"
Editar Esto funciona para cualquier cadena, independientemente del recuento de palabras:
simpleCap("I like pizza a lot")
[1] "I Like Pizza A Lot"
Otros consejos
Hay una construcción solución base-R Para el caso del título también:
tools::toTitleCase("demonstrating the title case")
## [1] "Demonstrating the Title Case"
o
library(tools)
toTitleCase("demonstrating the title case")
## [1] "Demonstrating the Title Case"
Coincidir con una expresión regular que comienza al principio ^
o después de un espacio [[:space:]]
y es seguido por un carácter alfabético [[:alpha:]]
. A nivel mundial (el G en GSUB) reemplaza todos esos ocurrencias con el comienzo o el espacio coincidente y la versión superior del carácter alfabético coincidente, \\1\\U\\2
. Esto debe hacerse con la coincidencia de expresión regular al estilo Perl.
gsub("(^|[[:space:]])([[:alpha:]])", "\\1\\U\\2", name, perl=TRUE)
# [1] "Zip Code" "State" "Final Count"
Con un poco más de detalle para el argumento de reemplazo a gsub()
, \\1
dice 'usa la parte de x
coincidir con la primera subexpresión ', es decir, la parte de x
pareo (^|[[:spacde:]])
. Igualmente, \\2
dice usar la parte de x
coincidir con la segunda subexpresión ([[:alpha:]])
. los \\U
es la sintaxis habilitada usando perl=TRUE
, y significa hacer el siguiente personaje en la parte superior del caso. Entonces, para "código postal", \\1
es "zip", \\2
es "código", \\U\\2
es "código", y \\1\\U\\2
es "código postal".
los ?regexp
La página es útil para comprender las expresiones regulares, ?gsub
por armar cosas.
Use esta función desde stringi
paquete
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"
Alternativa:
library(stringr)
a = c("capitalise this", "and this")
a
[1] "capitalise this" "and this"
str_to_title(a)
[1] "Capitalise This" "And This"
Probar:
require(Hmisc)
sapply(name, function(x) {
paste(sapply(strsplit(x, ' '), capitalize), collapse=' ')
})
De la página de ayuda para ?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"
El paquete BBmisc
ahora contiene la función 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!"
Forma alternativa con subcadena y regexpr:
substring(name, 1) <- toupper(substring(name, 1, 1))
pos <- regexpr(" ", name, perl=TRUE) + 1
substring(name, pos) <- toupper(substring(name, pos, pos))
También puede usar el paquete 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"
Esto da letras mayúsculas a todas las palabras principales
library(lettercase)
xString = str_title_case(xString)