2012-12-22 18 views
6

Ho un vettore di dati, una versione similified è qui sotto:Convertire tutto ciò che non è un numero a vuoto

x <- c("1234123xcv?","12341534xxx.","hello","goodbye") 

Quello che vorrei fare è di avere esso restituisce il seguente:

"1234123" "12341534" "" "" 

so che posso fare qualcosa di simile, dove ho specificare manualmente ciascuno/lettere maiuscole e minuscole i pochi caratteri speciali che io sappia:

grep("[A-Za-z\\?\\.]",x,value=TRUE) 

Ma non so cosa sia "else" nel campo che non sia necessariamente un numero. (e non è possibile visualizzarlo manualmente, perché è troppo grande)

Con questo in mente la mia domanda è: c'è un modo per specificare che si vogliono SOLO numeri da restituire in gsub()?

+0

Numeri o cifre? "-1" è un numero, così come "3.14", così come "1.2E07". – Spacedman

+0

Nel mio caso particolare, sono solo cifre. Non credo (credo) che ci siano numeri nei miei dati che sono formattati in questo modo. Il seguito molto simile al modello nell'esempio sopra. –

risposta

11
gsub("\\D","",x) # yada yada yada 
3

avete bisogno di qualcosa di simile:

[^0-9]* 

Ciò corrisponderà tutto ciò che non è una cifra, non c'è bisogno di specificare quale personaggio.

5

All'interno delle parentesi, ^ significa no. Quindi, questo dice sostituire tutto ciò che non è un numero con ""

> gsub("[^0-9]", "", x) 
[1] "1234123" "12341534" ""   "" 
4
gsub("[^[:digit:]]", "", x) #...... 
0

è possibile usare [\ d]. restituirà solo numeri.

+1

Er ,,,,, questo è R. –

+0

1. [] non sono necessari quando si ha un singolo elemento (ma che cosa si deve fare con esso?). 2. \ deve essere sfuggito. –

2

direi

gsub("[^0-9]+", "", x) 

[^ 0-9] sostituirà solo un carattere alla volta e [^ 0-9] + uno o più, che sarà più veloce.

+0

Falso. Guarda l'output della mia risposta. Dice sostituire tutto ciò che non è un numero con "" "'. '+' Non è necessario. – GSee

+0

@ Geeee, non penso che stesse dicendo che la tua versione era sbagliata. Solo che la sua versione farà meno sostituzioni sostituendo tutte le cifre non consecutive consecutive. Per lo stesso risultato. Potrebbe anche aver sostenuto che può essere più veloce in questo modo ... Comunque, metterlo in un commento sarebbe stato meglio, secondo me. – flodel

+0

@flodel. Buon punto E w_g non ha abbastanza rep per lasciare commenti ancora. Io modificherò in modo da poter annullare l'iscrizione. – GSee

Problemi correlati