2012-01-03 14 views
5

Ho una colonna in un dataframe in cui i valori sono combinazioni di numeri di lettere come G1, K8, A132, ecc. Voglio dividere la lettera dal numero ma mantenere il numero come un solo numero Ho utilizzato strsplit ma questo dà un elenco di valori come visto sotto dove avrei Liek avere all'uscita del G e 10:dividere un carattere da un numero con più cifre

x <- "G10" 
strsplit(x, "")[[1]][1] 
"G" 
strsplit(x, "")[[1]][-1] 
"1" "0" 

questo comporta i problemi a valle prevedibili quando si tenta di utilizzare i numeri come numeri. Ecco un esempio paste dove vorrei ottenere "somethingelse_10":

z <-strsplit(x, "")[[1]][-1] 
paste("somethingelse",z, sep="_") 
"somethingelse_1" "somethingelse_0" 

C'è un modo semplice per dividere numeri da lettere?

+0

è il formato sempre una singola lettera seguita da un numero? – Dason

+1

in questo caso c'è solo una singola lettera prima di un numero di una o più cifre. – zach

risposta

8

Il pacchetto stringr ha spesso convenienti funzioni per questo genere di cose:

require(stringr) 
str_extract(c("A1","B2","C123"),"[[:upper:]]") 
#[1] "A" "B" "C" 
str_extract(c("A1","B2","C123"),"[[:digit:]]+") 
#[1] "1" "2" "123" 

Ciò presuppone che ogni elemento ha esattamente una parte "lettera", e una parte "numero", poiché str_extract è solo tirando la prima istanza di una partita.

+0

grazie. funziona alla grande – zach

13

È possibile utilizzare gsub per eliminare tutti i non-cifre, o tutti i caratteri numerici in questo modo:

> x <- "A3" 
> gsub("[^[:digit:]]","",x) 
"3" 
> gsub("[:digit:]","",x) 
"A" 

E quindi è possibile utilizzare as.numeric convertire da stringa in numero, se si desidera.

+0

grazie aaronjg. anche questo funziona alla grande. – zach

+0

È possibile aggiungere una soluzione per estrarre lettere (vedere la risposta di joran). In effetti, si potrebbe scrivere una funzione per estrarre lettere e numeri e avere il lavoro 'apply' sulla colonna data.frame. :) –

+1

@aaronjg per ottenere le lettere è necessario un paio extra di [] – zach

3

Se ad esempio il tuo commento suggerisce basta una sola lettera seguita da una o più cifre che si potrebbe fare qualcosa di simile a questo:

x <- c("G10", "X1231", "y14522") 
# Just grab the first letter 
letter <- substring(x, 1, 1) 
letter 
# [1] "G" "X" "y" 
# Grab everything except the first character and convert to numeric 
number <- as.numeric(substring(x, 2, nchar(x))) 
number 
#[1] 10 1231 14522 
Problemi correlati