2016-08-02 14 views
0

Pretend Ich habe einen Vektor:Extrahieren einer Anzahl von einer Reihe von unterschiedlichen Längen

testVector <- c("I have 10 cars", "6 cars", "You have 4 cars", "15 cars") 

Gibt es eine Möglichkeit über das Parsen diesen Vektor zu gehen, so kann ich nur speichern die numerischen Werte:

10, 6, 4, 15 

Wenn das Problem nur "15 Autos" und "6 Autos" war, weiß ich, wie das zu analysieren ist, aber ich habe Schwierigkeiten mit den Strings, die Text auch vorne haben! Jede Hilfe wird sehr geschätzt.

Antwort

3

Wir können str_extract mit Muster \\d+ verwenden, was bedeutet, dass eine oder mehrere Zahlen übereinstimmen. Es kann auch anders geschrieben werden als [0-9]+.

library(stringr) 
as.numeric(str_extract(testVector, "\\d+")) 
#[1] 10 6 4 15 

Wenn es mehr Zahlen in einer Zeichenfolge sind, verwenden wir str_extract_all, die einen list Ausgang zurückkehren wil1.


Dies auch mit base R (ohne externe Pakete verwendet)

as.numeric(regmatches(testVector, regexpr("\\d+", testVector))) 
#[1] 10 6 4 15 

Oder mit gsub von base R

as.numeric(gsub("\\D+", "", testVector)) 
#[1] 10 6 4 15 

BTW, einige Funktionen verwenden getan werden kann, nur die gsub, von extract_numeric

function (x) 
{ 
    as.numeric(gsub("[^0-9.-]+", "", as.character(x))) 
} 

Also, wenn wir eine Funktion benötigen, können wir ein erstellen können (ohne externe Pakete mit)

ext_num <- function(x) { 
      as.numeric(gsub("\\D+", "", x)) 
     } 
ext_num(testVector) 
#[1] 10 6 4 15 
+0

Vielen Dank! Kannst du mir helfen zu beschreiben, was "\\ d +" bedeutet? – Sheila

+0

@Sheila Aktualisiert den Beitrag – akrun

+3

regex https://www.cheatography.com/davechild/cheat-sheets/regular-expressions/ – Nate

5

Für diese besondere gemeinsame Aufgabe, gibt es eine nette Helferfunktion in tidyrextract_numeric genannt:

library(tidyr) 

extract_numeric(testVector) 
## [1] 10 6 4 15 
1

Dies könnte auch nützlich sein.

testVector <- gsub("[:A-z:]","",testVector) 
testVector <- gsub(" ","",testVector) 

> testVector 
[1] "10" "6" "4" "15" 
Verwandte Themen