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")
¿Fue útil?

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"

https://github.com/tazinho/snakecase

Esto da letras mayúsculas a todas las palabras principales

library(lettercase)
xString = str_title_case(xString)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top