Je veux capitalise chaque mot d'une phrase sauf la toute première lettre. Il y a une discussion similaire ici - Capitaliser la première lettre des deux mots dans une chaîne de deux mots

Ainsi, la fonction peut être utilisée comme -

name <- c("zip code", "state", "final count")
simpleCap <- function(x) {
  s <- strsplit(x, " ")[[1]]
  paste(toupper(substring(s, 1,1)), substring(s, 2),
      sep="", collapse=" ")
}
sapply(name, simpleCap)

Mais il met également en majuscule la première lettre. Je veux quelque chose comme "zip Code" à la place "Zip Code". Y'a-t-il une quelconque façon de réussir cela?

Toute aide sera grandement appréciée.

2
Bogaso 27 sept. 2020 à 13:26

3 réponses

Meilleure réponse

Avec quelques expressions régulières de base:

name <- c("zip code", "state", "final count")
gsub("\\s([a-z])", " \\U\\1", name, perl = TRUE)
# [1] "zip Code"     "state"        "final Count"

Pour autoriser les lettres non-ascii:

name <- c("zip code", "state", "final count", "uribe álvaro")
gsub("\\s(\\p{L})", " \\U\\1", name, perl = TRUE)
# [1] "zip Code"     "state"        "final Count"  "uribe Álvaro"
2
sindri_baldur 27 sept. 2020 à 10:42

J'aime la deuxième solution de ce lien en utilisant toTitleCase. Vous pouvez utiliser regex pour rendre le premier caractère en minuscule.

simpleCap <- function(x) {
  sub('(.)', '\\L\\1', tools::toTitleCase(x), perl = TRUE)
}

simpleCap('Zip Code')
#[1] "zip Code"
simpleCap('this text')
#[1] "this Text"
simpleCap(name)
#[1] "zip Code"    "state"       "final Count"
3
Ronak Shah 27 sept. 2020 à 10:37

Ou avec une légère modification de l'approche strsplit:

capExceptFirst <- function(x) {
  s <- strsplit(x, " ")[[1]]
  
  paste(
    tolower(s[1]),
    paste(toupper(substring(s[-1], 1,1)), substring(s[-1], 2),
        sep="", collapse=" "),
    collapse = " "
  )
}

sapply(name, capExceptFirst)

Production:

     zip code         state   final count 
   "zip Code"      "state " "final Count" 
2
arg0naut91 27 sept. 2020 à 10:34