2014-07-25 14 views
9

Kollegen,Großschreibung von Buchstaben. R Äquivalent von Excel „Proper“ Funktion

Ich bin an einem Datenrahmen der Suche unter den Extrakt ähnelt:

Month Provider Items 
January CofCom 25 
july CofCom 331 
march vobix 12 
May  vobix 0 

Ich möchte ersten Buchstaben jedes Wortes nutzen und senken Sie die verbleibenden Buchstaben für jedes Wort. Dies würde in dem Datenrahmen führt die unten ähnelt:

Month Provider Items 
January Cofcom 25 
July Cofcom 331 
March Vobix 12 
May  Vobix 0 

Mit einem Wort, ich bin für R äquivalent der ROPER Funktion in MS Excel suchen.

+0

Siehe 'capwords' Funktion in' tolower? 'help page – user20650

+0

Es gibt eine' capwords' -Funktion, die im Beispiel-Abschnitt von '? tolower' definiert ist. –

Antwort

7

Die Frage ist etwa ein Äquivalent von Excel PROPER und der (ehemaligen) akzeptierte Antwort basiert auf:

proper=function(x) paste0(toupper(substr(x, 1, 1)), tolower(substring(x, 2))) 

Es könnte sich lohnen, unter Hinweis darauf, dass:

proper("hello world") 
## [1] "Hello world" 

Excel PROPER würde stattdessen "Hallo Welt" geben. Zum 1: 1-Mapping mit Excel siehe @Matthew Plourde.

Wenn das, was Sie wirklich brauchen nur das erste Zeichen einer Zeichenkette in Großbuchstaben gesetzt ist, können Sie auch die kürzere und etwas schnellere Version betrachten:

proper=function(s) sub("(.)", ("\\U\\1"), tolower(s), pe=TRUE) 
5

Ich denke nicht, es ist, aber man kann es sich leicht schreiben

(dat <- data.frame(x = c('hello', 'frIENds'), 
        y = c('rawr','rulZ'), 
        z = c(16, 18))) 
#   x y z 
# 1 hello rawr 16 
# 2 frIENds rulZ 18 

proper <- function(x) 
    paste0(toupper(substr(x, 1, 1)), tolower(substring(x, 2))) 


(dat <- data.frame(lapply(dat, function(x) 
    if (is.numeric(x)) x else proper(x)), 
    stringsAsFactors = FALSE)) 

#   x y z 
# 1 Hello Rawr 16 
# 2 Friends Rulz 18 

str(dat) 
# 'data.frame': 2 obs. of 3 variables: 
# $ x: chr "Hello" "Friends" 
# $ y: chr "Rawr" "Rulz" 
# $ z: num 16 18 
+0

Danke, das ist, was ich gesucht habe. Es ist so eine nette Sache, die Teil der Basis sein sollte :) – Konrad

+0

Nur ein Wort der Vorsicht, die verfügbare numerische Spalte in der Funktion wurde in Faktor geändert, nachdem ich diese Funktion anwendete, die das Diagramm etwas durcheinander brachte, so musste ich es machen wieder numerisch. – Konrad

+0

@Konrad, dass dieser Fall, würde ich, 'data.frame (lapply (dat, Funktion (x) if (is.numeric (x)) x sonst richtig (x))) oder etwas ähnliches – rawr

17

mit regulären Ausdrücken:

x <- c('woRd Word', 'Word', 'word words') 
gsub("(?<=\\b)([a-z])", "\\U\\1", tolower(x), perl=TRUE) 
# [1] "Word Word" "Word"  "Word Words" 

(?<=\\b)([a-z]) sagt für einen Kleinbuchstaben durch eine Wortgrenze voran aussehen (zB , ein Leerzeichen oder der Anfang einer Zeile). (?<=...) wird eine "Look-Behind" -Assistenz genannt. \\U\\1 sagt ersetzen dieses Zeichen mit seiner Großbuchstaben-Version. \\1 ist eine Rückverweis auf die erste Gruppe von () im Muster umgeben. Weitere Informationen finden Sie unter ?regex.

Wenn Sie nur den ersten Buchstaben des ersten Wortes groß schreiben möchten, verwenden Sie stattdessen das Muster "^([a-z]).

+1

Dies ist die tatsächliche Antwort. Ich fordere den Fragesteller auf, ihren Scheck zu überdenken. –

+0

Ist die Rückreferenz erforderlich? Würde dies nicht zum selben Ergebnis führen? 'gsub (" (\\ b [a-z]) "," \\ U \\ 1 ", tolower (xx), perl = WAHR)' – Stan

8

Eine andere Methode verwendet das Stringi-Paket. Die stri_trans_general-Funktion scheint alle Buchstaben außer dem Anfangsbuchstaben zu verkleinern.

require(stringi) 
x <- c('woRd Word', 'Word', 'word words') 
stri_trans_general(x, id = "Title") 
[1] "Word Word" "Word"  "Word Words" 
Verwandte Themen