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")

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"

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"

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.


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"

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"   

Accessoires pour la réponse stringr! Merci!
Neal Barsch


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"

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!"

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))

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


2

Cela donne des lettres majuscules à tous les mots principaux

library(lettercase)
xString = str_title_case(xString)

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.