Großschreiben Sie den ersten Buchstaben beider Wörter in einer Zeichenfolge mit zwei Wörtern


174

Nehmen wir an, ich habe eine Zeichenfolge mit zwei Wörtern und möchte beide groß schreiben.

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

Das HmiscPaket hat eine Funktion, capitalizedie das erste Wort großschreibt, aber ich bin nicht sicher, wie das zweite Wort großgeschrieben werden soll. Die Hilfeseite für capitalizeschlägt nicht vor, dass diese Aufgabe ausgeführt werden kann.

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

Ich möchte bekommen:

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

Was ist mit Drei-Wort-Zeichenfolgen:

name2 <- c("I like pizza")

Antworten:


172

Die Basis-R-Funktion zur Durchführung der Großschreibung ist toupper(x). Aus der Hilfedatei für ?touppergibt es diese Funktion, die das tut, was Sie brauchen:

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" 

Bearbeiten Dies funktioniert für jede Zeichenfolge, unabhängig von der Wortanzahl:

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

11
Und wenn dies für andere hilfreich ist, denken Sie daran, dass Sie durch Einfügen der Tolower-Funktion in die simpleCap-Funktion auch mit allen gekappten Wörtern umgehen können: Ist Code, mit dem Sie umgehen können: <br/> name <- c ("george wasHINgton", "tom jefferson" "," ABE LINCOLN ") simpleCap <- Funktion (x) {s <- tolower (x) s <- strsplit (s," ") [[1]] paste (toupper (Teilzeichenfolge (s, 1,1))) , Teilzeichenfolge (s, 2), sep = "" ,apse = "")} sapply (name, simpleCap)
MatthewR

Wie wäre es mit getrennten Namen? Wie Smith-Jones oder Al-Rayon, die als SMITH-JONES oder Al-Rayon eingegeben werden könnten.
Hack-R

1
Sie können paste0()anstelle von verwenden paste(..., sep=""). Einfach kürzer.
MERose

3
@merose Richtig, aber nicht in diesem Fall, da paste0 ()das collapse = ...Argument nicht akzeptiert
Andrie

3
@Andrie ist das noch richtig? paste0(c("a", "b"), collapse = ",")funktioniert gut für mich. Vielleicht ist dies eine neue Funktion?
MichaelChirico

156

Es gibt auch eine integrierte Base-R-Lösung für den Titelfall:

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

oder

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

3
Ein wenig in die Quelle geschaut, zeigt es, dass die Funktion versucht, eine Groß- und Kleinschreibung zu erreichen (was etwas anderes ist als alle Wörter, die mit Großbuchstaben beginnen), indem alle Wörter mit Großbuchstaben beginnen, mit Ausnahme einer Sammlung der wahrscheinlichsten englischen Ausnahmen (wie z. B. 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
Sie könnten überrascht sein, wenn Sie erwarten, dass NUR das ursprüngliche Zeichen groß geschrieben wird. tools::toTitleCase("HELLO")führt zu HELLO. Vielleicht möchten Sie dies tolowerzuerst umwickeln , als so: tools::toTitleCase(tolower("HELLO"))was zurückgibtHello
ddunn801

2
gutes ppint - immer noch das Titel-Fall-ishst, das Sie so weit bekommen können
petermeissner

Vielen Dank! Diese Lösung funktioniert in den meisten Fällen hervorragend, außer wenn es Abkürzungen für US-Bundesstaaten gibt
Tung

97

Entspricht einem regulären Ausdruck, der am Anfang ^oder nach einem Leerzeichen beginnt und auf das [[:space:]]ein alphabetisches Zeichen folgt [[:alpha:]]. Ersetzen Sie global (das g in gsub) alle derartigen Vorkommen durch den übereinstimmenden Anfang oder Leerzeichen und die Großbuchstabenversion des übereinstimmenden alphabetischen Zeichens \\1\\U\\2. Dies muss mit dem Abgleich regulärer Ausdrücke im Perl-Stil erfolgen.

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

In etwas ausführlicher für den Ersatz Argument gsub(), \\1sagt ‚den Teil verwenden von xder ersten Unter Ausdruck übereinstimmen‘, dh der Teil der xAnpassungs (^|[[:spacde:]]). Ebenso \\2sagt, benutze den Teil der xÜbereinstimmung mit dem zweiten Unterausdruck ([[:alpha:]]). Die \\USyntax wird mithilfe von perl=TRUEund aktiviert , um das nächste Zeichen in Großbuchstaben zu schreiben. Also für "Postleitzahl" \\1ist "Postleitzahl", \\2ist "Code", \\U\\2ist "Code" und \\1\\U\\2ist "Postleitzahl".

Die ?regexpSeite ist hilfreich, um reguläre Ausdrücke zu verstehen ?gsubund Dinge zusammenzusetzen.


12
bah! Ich bin ursprünglich diesen Weg gegangen, habe ihn aber fälschlicherweise benutzt \\uund aufgegeben, bevor mir klar wurde, dass ich ihn hätte kapitalisieren sollen ... etwas ironisch. Hier ist, was ich mir ausgedacht habe, nicht gründlich gegen einen seltsamen Ballfall geprüftgsub(pattern = "\\b([a-z])", replacement = "\\U\\1", name, perl = TRUE)
Chase

Ich habe versucht, dies für Zeilennamen zu verwenden, und es hat einmal funktioniert, aber ich konnte es nicht wiederholen.
dpel

Funktioniert, tolower(name)wenn es andere Kappen gibt
MichaelChirico

83

Verwenden Sie diese Funktion aus dem stringiPaket

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
Das stringr-Paket (wenn das tidyverse Ihr Ding ist) verpackt das stri_tans_totitlein eine Funktion namens str_to_title(). Es ist nur das stringi :: stri_trans_totitle () unter der Decke, aber je nach Workflow kann das Laden einer anderen Bibliothek (die Sie im Wesentlichen bereits geladen haben) gespeichert werden.
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"   

Requisiten für die stringr Antwort! Vielen Dank!
Neal Barsch


16

Von der Hilfeseite für ?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

Das Paket BBmiscenthält jetzt die Funktion 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

Alternativer Weg mit Teilzeichenfolge und Regexpr:

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

4

Sie können auch das Snakecase-Paket verwenden:

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

Dies gibt allen wichtigen Wörtern Großbuchstaben

library(lettercase)
xString = str_title_case(xString)

Funktioniert nicht perfekt> lettercase::str_title_case("HEY HELLO") [1] "HEY HELLO"
Tung

Ja, ich würde empfehlen, zuerst tolower (x) zu verwenden. Außerdem habe ich einen Fehler gemacht, als ich "alle wichtigen Wörter" gesagt habe. Diese Funktion funktioniert bei allen Wörtern.
Cole Davis

Eine weitere Option: Bibliothek (Hmisc) # Kapitalisierungsfunktion
Cole Davis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.