Scrivi in ​​maiuscolo la prima lettera di entrambe le parole in una stringa di due parole


174

Diciamo che ho una stringa di due parole e voglio capitalizzare entrambe.

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

Il Hmiscpacchetto ha una funzione capitalizeche utilizza la maiuscola per la prima parola, ma non sono sicuro di come utilizzare la seconda parola in maiuscolo. La pagina di aiuto per capitalizenon suggerisce che può eseguire quell'attività.

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

Voglio ottenere:

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

Che dire delle stringhe di tre parole:

name2 <- c("I like pizza")

Risposte:


172

La funzione R di base per eseguire le maiuscole è toupper(x). Dal file di aiuto per ?toupperc'è questa funzione che fa quello che ti serve:

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" 

Modifica Funziona con qualsiasi stringa, indipendentemente dal conteggio delle parole:

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

11
E se questo è utile ad altri, ricorda inserendo la funzione tolower all'interno della funzione simpleCap puoi occuparti anche di tutte le parole limitate: è un codice che puoi trattare: <br/> name <- 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

Che ne dici di nomi sillabati? Come Smith-Jones o Al-Rayon, che potrebbe essere inserito come SMITH-JONES o al-rayon.
Hack-R,

1
Puoi usare paste0()invece di paste(..., sep=""). Semplicemente più breve.
MERose

3
@merose Corretto, ma non in questo caso, poiché paste0 ()non accetta l' collapse = ...argomento
Andrie,

3
@Andrie è ancora corretto? paste0(c("a", "b"), collapse = ",")funziona bene per me. Forse questa è una funzionalità recente?
MichaelChirico,

156

Esiste anche una soluzione base-R integrata per il case dei titoli:

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

o

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

3
Dopo aver esaminato un po 'la fonte, mostra che la funzione cerca di ottenere il caso del titolo (che è qualcos'altro che tutte le parole iniziano con la lettera maiuscola) lasciando iniziare tutte le parole con le lettere maiuscole tranne una raccolta di eccezioni inglesi molto probabilmente (come ad esempio 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
Potresti essere sorpreso se ti aspetti che SOLO il personaggio iniziale sia in maiuscolo. tools::toTitleCase("HELLO")risultati in HELLO. Potresti voler tolowerprima concludere questo , così: tools::toTitleCase(tolower("HELLO"))che ritornaHello
ddunn801,

2
buona ppint - è ancora il caso del titolo che puoi ottenere così lontano
petermeissner

Grazie! Questa soluzione funziona alla grande per la maggior parte dei casi, tranne quando ci sono abbreviazioni di stati statunitensi
Tung

97

Abbina un'espressione regolare che inizia all'inizio ^o dopo uno spazio [[:space:]]ed è seguito da un carattere alfabetico [[:alpha:]]. Globale (g in gsub) sostituire tutti tali occorrenze con l'inizio abbinato o di spazio e la versione maiuscola del carattere alfabetico corrispondente, \\1\\U\\2. Questo deve essere fatto con la corrispondenza delle espressioni regolari in stile perl.

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

Più in dettaglio per l'argomento di sostituzione gsub(), \\1dice "usa la parte della xcorrispondenza della prima sottoespressione", cioè la parte della xcorrispondenza (^|[[:spacde:]]). Allo stesso modo, \\2dice usa la parte della xcorrispondenza della seconda sottoespressione ([[:alpha:]]). La \\Usintassi è abilitata usando perl=TRUE, e significa rendere il carattere successivo in maiuscolo. Quindi per "Codice postale", \\1è "Codice postale", \\2è "Codice", \\U\\2è "Codice" ed \\1\\U\\2è "Codice postale".

La ?regexppagina è utile per comprendere le espressioni regolari, ?gsubper mettere insieme le cose.


12
Bah! Inizialmente ho seguito questa strada, ma per sbaglio stavo usando \\ue ho rinunciato prima di rendermi conto che avrei dovuto capitalizzare ... un po 'ironico. Ecco cosa mi è venuto in mente, non completamente controllato contro un caso stranogsub(pattern = "\\b([a-z])", replacement = "\\U\\1", name, perl = TRUE)
Chase,

Ho provato a usarlo sui nomi delle righe e ha funzionato una volta ma non sono riuscito a ripeterlo.
Dpel,

Funziona su tolower(name)se ci sono altri tappi
MichaelChirico,

83

Utilizzare questa funzione dal stringipacchetto

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
Il pacchetto stringr (se il tidyverse è la tua cosa) lo avvolge stri_tans_totitlein una funzione chiamata str_to_title(). È solo il stringi :: stri_trans_totitle () sotto le copertine, ma potrebbe salvare il caricamento di un'altra libreria (che, in sostanza, potresti già aver caricato), a seconda del flusso di lavoro.
Crazybilly,

50

Alternativa:

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

Puntelli per la risposta stringr! Grazie!
Neal Barsch,


16

Dalla pagina di aiuto per ?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

Il pacchetto BBmiscora contiene la funzione 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

Modo alternativo con sottostringa e regexpr:

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

5

Puoi anche usare il pacchetto 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

Questo dà lettere maiuscole a tutte le parole principali

library(lettercase)
xString = str_title_case(xString)

Non funziona perfettamente> lettercase::str_title_case("HEY HELLO") [1] "HEY HELLO"
Tung,

Sì, suggerirei di utilizzare prima tolower (x). Inoltre ho fatto un errore nel dire "tutte le parole principali"; questa funzione funziona su tutte le parole.
Cole Davis,

Un'altra opzione: library (Hmisc) # capitalize function
Cole Davis
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.