2014-07-25 9 views
9

Colleghi,Lettere maiuscole. R equivalente di Excel funzione "propria"

sto guardando un frame di dati che assomiglia l'estratto qui sotto:

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

Vorrei capitalizzare prima lettera di ogni parola e abbassare il restante lettere per ogni parola. Ciò comporterebbe il frame di dati simile a quella riportata di seguito:

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

In una parola, sto cercando equivalente di R della funzione ROPER disponibile in MS Excel.

+0

Vedere 'funzione capwords' in' tolower? 'help page – user20650

+0

C'è una funzione' capwords' definita nella sezione Esempi di '? tolower'. –

risposta

7

La domanda è circa l'equivalente di Excel PROPER e la (ex) risposta accettata si basa su:

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

Potrebbe valere la pena di notare che:

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

Excel PROPER darebbe, invece, "Hello World". Per la mappatura 1: 1 con Excel, vedere @Matthew Plourde.

Se quello che realmente bisogno è di impostare solo il primo carattere di una stringa in maiuscolo, si potrebbe anche prendere in considerazione la versione più breve e leggermente più veloce:

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

io non credo ce n'è uno, ma si può facilmente scrivere voi stessi

(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

Grazie, questo è quello che stavo cercando. È una cosa così bella che dovrebbe essere parte della base :) – Konrad

+0

Solo una parola di cautela che la colonna numerica disponibile nella funzione è stata modificata in fattore dopo l'applicazione di questa funzione, che ha incasinato il grafico un po 'così ho dovuto farlo di nuovo numerico. – Konrad

+0

@Konrad che quel caso, vorrei, 'data.frame (lapply (dat, function (x) if (is.numeric (x)) x else proper (x)))' o qualcosa di simile – rawr

17

con le espressioni regolari:

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]) dice cercare una lettera minuscola preceduto da un limite di una parola (ad esempio, , uno spazio o l'inizio di una riga). (?<=...) è chiamata asserzione "look-behind". \\U\\1 dice sostituire quel personaggio con la sua versione maiuscola. \\1 è un riferimento posteriore al primo gruppo circondato da () nel modello. Vedi ?regex per maggiori dettagli.

Se si desidera utilizzare solo la prima lettera della prima parola, utilizzare il modello "^([a-z]).

+1

Questa è la risposta effettiva. Invito l'interrogante a riconsiderare il loro assegno. –

+0

Il riferimento all'indietro è necessario? Non darebbe lo stesso risultato? 'gsub (" (\\ b [a-z]) "," \\ U \\ 1 ", tolower (xx), perl = TRUE)' – Stan

8

Un altro metodo utilizza il pacchetto stringi. La funzione stri_trans_general sembra minuscola tutte le lettere tranne la lettera iniziale.

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