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

174

Disons que j'ai une chaîne de deux mots et que je veux les mettre tous les deux en majuscule.

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

Le Hmiscpackage a une fonction capitalizequi met en majuscule le premier mot, mais je ne sais pas comment mettre le deuxième mot en majuscule. La page d'aide de capitalizene suggère pas qu'il 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")
ATMathew
la source

Réponses:

172

La fonction de base R pour effectuer la capitalisation est toupper(x). Dans le fichier d'aide, ?toupperil 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, quel que soit le nombre de mots:

simpleCap("I like pizza a lot")
[1] "I Like Pizza A Lot"
Andrie
la source
11
Et si cela est utile à d'autres, rappelez-vous qu'en mettant la fonction tolower à l'intérieur de la fonction simpleCap, vous pouvez également traiter tous les mots plafonnés: c'est du code que vous pouvez traiter: <br/> nom <- c ("george wasHINgton", "tom jefferson "," ABE LINCOLN ") simpleCap <- function (x) {s <- tolower (x) s <- strsplit (s," ") [[1]] paste (toupper (substring (s, 1,1)) , substring (s, 2), sep = "", collapse = "")} sapply (name, simpleCap)
MatthewR
Et les noms avec trait d'union? Comme Smith-Jones ou Al-Rayon, qui pourrait être inscrit comme SMITH-JONES ou al-rayon.
Hack-R
1
Vous pouvez utiliser à la paste0()place de paste(..., sep=""). Simplement plus court.
MERose
3
@merose Correct, mais pas dans ce cas, car paste0 ()n'accepte pas l' collapse = ...argument
Andrie
3
@Andrie est-ce toujours correct? paste0(c("a", "b"), collapse = ",")fonctionne bien pour moi. C'est peut-être une fonctionnalité récente?
MichaelChirico
156

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

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

ou

library(tools)
toTitleCase("demonstrating the title case")
## [1] "Demonstrating the Title Case"
Petermeissner
la source
3
Après avoir examiné un peu la source, cela montre que la fonction essaie de réaliser la casse du titre (ce qui est autre chose que tous les mots commençant par une majuscule) en laissant commencer tous les mots avec des lettres majuscules sauf une collection d'exceptions les plus probables en anglais (comme par exemple c("all", "above", "after", "along", "also", "among", "any", "both", "can", "few", "it", "less", "log", "many", "may", "more", "over", "some", "their", "then", "this", "under", "until", "using", "von", "when", "where", "which", "will", "without", "yet", "you", "your"))
petermeissner
15
Vous pourriez être surpris si vous vous attendez à ce que SEUL le caractère initial soit en majuscule. tools::toTitleCase("HELLO")se traduit par HELLO. Vous voudrez peut-être aborder ceci en tolowerpremier, comme ceci: tools::toTitleCase(tolower("HELLO"))qui retourneHello
ddunn801
2
bon ppint - c'est toujours le titre-cas-ishst que vous pouvez obtenir jusqu'ici
petermeissner
Merci! Cette solution fonctionne très bien dans la plupart des cas, sauf lorsqu'il y a des abréviations d'états américains
Tung
97

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:]]. À l' échelle mondiale (les g en gsub) remplacer tous ces événements avec le début identifié ou de l' espace et la version majuscule du caractère alphabétique identifié, \\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"

Dans un peu plus de détails pour l'argument de remplacement à gsub(), \\1dit «utiliser la partie de la xcorrespondance de la première sous-expression», c'est-à-dire la partie de la xcorrespondance (^|[[:spacde:]]). De même, \\2indique utiliser la partie xcorrespondant à la deuxième sous-expression ([[:alpha:]]). La \\Usyntaxe est activée en utilisant perl=TRUE, et signifie que le caractère suivant est en majuscule. Donc, pour "Code postal", \\1est "Zip", \\2est "code", \\U\\2est "Code" et \\1\\U\\2est "Code postal".

La ?regexppage est utile pour comprendre les expressions régulières, ?gsubpour mettre les choses ensemble.

Martin Morgan
la source
12
bah! Au départ, j'ai emprunté cette voie, mais j'utilisais par erreur \\uet j'ai abandonné avant de réaliser que j'aurais dû la capitaliser ... quelque peu ironique. Voici ce que j'ai trouvé, pas complètement vérifié par rapport à un cas de balle étrangegsub(pattern = "\\b([a-z])", replacement = "\\U\\1", name, perl = TRUE)
Chase
J'ai essayé de l'utiliser sur les noms de lignes et cela a fonctionné une fois, mais je n'ai pas pu le répéter.
dpel
Fonctionne tolower(name)s'il y a d'autres casquettes
MichaelChirico
83

Utilisez cette fonction à partir du stringipackage

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"
bartektartanus
la source
24
Le package stringr (si le tidyverse est votre truc) enveloppe le stri_tans_totitledans une fonction nommée str_to_title(). C'est juste le stringi :: stri_trans_totitle () sous les couvertures, mais cela peut vous éviter de charger une autre bibliothèque (que vous pouvez, en substance, déjà chargée), en fonction de votre flux de travail.
crazybilly
50

Alternative:

library(stringr)
a = c("capitalise this", "and this")
a
[1] "capitalise this" "and this"       
str_to_title(a)
[1] "Capitalise This" "And This"   
Brijesh
la source
Accessoires pour la réponse stringr! Merci!
Neal Barsch
21

Essayer:

require(Hmisc)
sapply(name, function(x) {
  paste(sapply(strsplit(x, ' '), capitalize), collapse=' ')
})
diliop
la source
Notez que Hmiscpeut remplacer plyrla summarizefonction de comme mentionné ici: stackoverflow.com/a/35324305/288875
Andre Holzner
2
@AndreHolzner Ou l'inverse. Hmiscest un peu plus vieux que plyr...
Joris Meys
16

Depuis 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"
Chasse
la source
9

Le package BBmisccontient maintenant la fonction 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!"
Poignard
la source
6

Méthode alternative avec sous-chaîne et regexpr:

substring(name, 1) <- toupper(substring(name, 1, 1))
pos <- regexpr(" ", name, perl=TRUE) + 1
substring(name, pos) <- toupper(substring(name, pos, pos))
Greg L
la source
5

Vous pouvez également utiliser le package snakecase:

install.packages("snakecase")
library(snakecase)

name <- c("zip code", "state", "final count")
to_title_case(name)
#> [1] "Zip Code"    "State"       "Final Count"

# or 
to_upper_camel_case(name, sep_out = " ")
#> [1] "Zip Code"    "State"       "Final Count"

https://github.com/Tazinho/snakecase

Taz
la source
2

Cela donne des lettres majuscules à tous les mots principaux

library(lettercase)
xString = str_title_case(xString)
Cole Davis
la source
Ne fonctionne pas parfaitement> lettercase::str_title_case("HEY HELLO") [1] "HEY HELLO"
Tung
Oui, je suggérerais d'utiliser d'abord tolower (x). J'ai également fait une erreur en disant «tous les mots principaux»; cette fonction fonctionne sur tous les mots.
Cole Davis le
Une autre option: library (Hmisc) # capitalize function
Cole Davis