2012-12-22 4 views
6

Ich habe einen Vektor von Daten, eine similified Version unter:alles, was nicht eine Zahl ist zu leer

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

Was ich möchte, ist zu tun haben, es zurückgeben folgendes:

"1234123" "12341534" "" "" 

ich weiß, dass ich etwas tun kann, wo ich jeweils Groß-/Kleinbuchstaben manuell angeben und die wenigen Sonderzeichen, die ich bewusst bin:

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

Aber ich weiß nicht, was "sonst" im Feld ist, das ist nicht unbedingt eine Nummer. (und kann nicht manuell durchsehen, weil es zu groß ist)

Mit diesem Gedanken meine Frage ist: Gibt es eine Möglichkeit zu spezifizieren, dass Sie NUR Zahlen in gsub() zurückgegeben werden sollen?

+0

Zahlen oder Ziffern? "-1" ist eine Zahl, wie "3.14", wie "1.2E07". – Spacedman

+0

In meinem speziellen Fall sind es nur Ziffern. Ich glaube nicht, dass ich irgendwelche Zahlen in meinen Daten habe, die so formatiert sind. Das folgt weitgehend dem Muster im obigen Beispiel. –

Antwort

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

Sie brauchen etwas wie folgt aus:

[^0-9]* 

Dies wird alles akzeptiert, das keine Ziffer ist, keine Notwendigkeit, welches Zeichen angeben.

5

In den Klammern bedeutet ^ nicht. Also, sagt diese ersetzen, was auch immer ist keine Zahl mit ""

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

Sie können [\ d]. gibt nur Zahlen zurück.

+1

Er ,,,,, das ist R. –

+0

1. [] sind nicht notwendig, wenn Sie ein einzelnes Element haben (aber was haben Sie damit zu tun?). 2. \ muss entkommen sein. –

2

würde ich sagen,

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

[^ 0-9] wird auf einmal nur ein Zeichen ersetzen und [^ 0-9] + ein oder mehrere, die schneller sein wird.

+0

Falsch. Sehen Sie sich die Ausgabe meiner Antwort an. Es sagt, ersetzen Sie alles, was keine Zahl ist mit "" ". Das '+' ist unnötig. – GSee

+0

@Gsee, ich glaube nicht, dass er gesagt hat, dass deine Version falsch ist. Nur dass seine Version weniger Auswechslungen durchführen wird, indem sie aufeinanderfolgende Nicht-Ziffern gleichzeitig ersetzt. Für das gleiche Ergebnis. Er hätte sogar argumentieren können, dass es auf diese Weise schneller gehen könnte ... Jedenfalls wäre es meiner Meinung nach besser gewesen, das in einen Kommentar zu schreiben. – flodel

+0

@ flodel. Guter Punkt. Und w_g hat nicht genug Rep, um Kommentare zu hinterlassen. Ich werde bearbeiten, damit ich den Eintrag abwählen kann. – GSee

Verwandte Themen