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

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"
Andrie
quelle
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"
Petermeissner
quelle
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.

Martin Morgan
quelle
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"
Bartektartanus
quelle
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"   
Brijesh
quelle
Requisiten für die stringr Antwort! Vielen Dank!
Neal Barsch
21

Versuchen:

require(Hmisc)
sapply(name, function(x) {
  paste(sapply(strsplit(x, ' '), capitalize), collapse=' ')
})
Diliop
quelle
Beachten Sie, dass Hmiscaußer Kraft setzen kann plyr‚s - summarizeFunktion , wie hier erwähnt: stackoverflow.com/a/35324305/288875
Andre Holzner
2
@AndreHolzner Oder umgekehrt. Hmiscist ziemlich viel älter als plyr...
Joris Meys
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"
Verfolgungsjagd
quelle
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!"
Dolch
quelle
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))
greg L.
quelle
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

Taz
quelle
2

Dies gibt allen wichtigen Wörtern Großbuchstaben

library(lettercase)
xString = str_title_case(xString)
Cole Davis
quelle
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