Mettre en majuscule la première lettre des deux mots dans une chaîne de deux mots

Disons que j’ai une chaîne de deux mots et je veux les capitaliser tous les deux.

name <- c("zip code", "state", "final count") 

Le paquet Hmisc a une fonction capitalize qui met en majuscule le premier mot, mais je ne sais pas comment obtenir le deuxième mot en majuscule. La page d’aide pour les capitalize ne suggère pas qu’elle peut effectuer cette tâche.

 library(Hmisc) capitalize(name) # [1] "Zip code" "State" "Final count" 

Je veux obtenir:

 c("Zip Code", "State", "Final Count") 

Qu’en est-il des chaînes de trois mots:

 name2 <- c("I like pizza") 

La fonction de base R pour effectuer la capitalisation est toupper(x) . À partir du fichier d’aide de ?toupper il y a cette fonction qui fait ce dont vous avez besoin:

 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" 

Modifier Cela fonctionne pour n'importe quelle chaîne, indépendamment du nombre de mots:

 simpleCap("I like pizza a lot") [1] "I Like Pizza A Lot" 

Correspond à une expression régulière qui commence au début ^ ou après un espace [[:space:]] et est suivie d’un caractère alphabétique [[:alpha:]] . Globalement (le g dans gsub) remplace toutes ces occurrences par le début ou l’espace correspondant et la version majuscule du caractère alphabétique correspondant, \\1\\U\\2 . Cela doit être fait avec une correspondance d’expressions régulières de style perl.

 gsub("(^|[[:space:]])([[:alpha:]])", "\\1\\U\\2", name, perl=TRUE) # [1] "Zip Code" "State" "Final Count" 

Un peu plus en détail pour l’argument de remplacement de gsub() , \\1 dit “utiliser la partie de x correspondant à la première sous-expression”, c’est-à-dire la partie de x correspondant (^|[[:spacde:]]) . De même, \\2 dit utiliser la partie de x correspondant à la deuxième sous-expression ([[:alpha:]]) . Le \\U est la syntaxe activée en utilisant perl=TRUE , et signifie que le caractère suivant est en majuscule. Donc, pour “Code postal”, \\1 est “Zip”, \\2 est “code”, \\U\\2 est “Code” et \\1\\U\\2 est “Code postal”.

La page ?gsub est utile pour comprendre les expressions régulières ?gsub pour rassembler les choses.

Il existe également une solution de base-R intégrée pour la casse:

 tools::toTitleCase("demonstrating the title case") ## [1] "Demonstrating the Title Case" 

ou

 library(tools) toTitleCase("demonstrating the title case") ## [1] "Demonstrating the Title Case" 

Utilisez cette fonction du paquet ssortingngi

 ssorting_trans_totitle(c("zip code", "state", "final count")) ## [1] "Zip Code" "State" "Final Count" ssorting_trans_totitle("i like pizza very much") ## [1] "I Like Pizza Very Much" 

Essayer:

 require(Hmisc) sapply(name, function(x) { paste(sapply(strsplit(x, ' '), capitalize), collapse=' ') }) 

Alternative:

 library(ssortingngr) a = c("capitalise this", "and this") a [1] "capitalise this" "and this" str_to_title(a) [1] "Capitalise This" "And This" 

De la page d’aide pour ?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" 

Le package BBmisc contient maintenant la fonction capitalizeSsortingngs .

 library("BBmisc") capitalizeSsortingngs(c("the taIl", "wags The dOg", "That Looks fuNny!") , all.words = TRUE, lower.back = TRUE) [1] "The Tail" "Wags The Dog" "That Looks Funny!" 

Autre manière avec sous-chaîne et regexpr:

 subssortingng(name, 1) <- toupper(substring(name, 1, 1)) pos <- regexpr(" ", name, perl=TRUE) + 1 substring(name, pos) <- toupper(substring(name, pos, pos)) 

Vous pouvez également utiliser le package 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

Cela donne des lettres majuscules à tous les mots majeurs

 library(lettercase) xSsortingng = str_title_case(xSsortingng)