Zahlen aus Vektoren von Strings extrahieren

Ich habe String wie folgt:

years<-c("20 years old", "1 years old") 

Ich möchte nur die numerische Zahl von diesem Vektor grep. Erwartete Ausgabe ist ein Vektor:

 c(20, 1) 

Wie gehe ich dabei vor?

Wie wäre es mit

 # pattern is by finding a set of numbers in the start and capturing them as.numeric(gsub("([0-9]+).*$", "\\1", years)) 

oder

 # pattern is to just remove _years_old as.numeric(gsub(" years old", "", years)) 

oder

 # split by space, get the element in first index as.numeric(sapply(strsplit(years, " "), "[[", 1)) 

Ich denke, dass Substitution ein indirekter Weg ist, um zur Lösung zu kommen. Wenn Sie alle Zahlen abrufen möchten, empfehle ich gregexpr :

 matches < - regmatches(years, gregexpr("[[:digit:]]+", years)) as.numeric(unlist(matches)) 

Wenn Sie mehrere Übereinstimmungen in einer Zeichenfolge haben, werden alle von ihnen erhalten. Wenn Sie nur an der ersten Übereinstimmung interessiert sind, verwenden Sie regexpr anstelle von gregexpr und Sie können die unlist überspringen.

Hier ist eine Alternative zu Aruns erster Lösung mit einem einfacheren Perl-ähnlichen regulären Ausdruck:

 as.numeric(gsub("[^\\d]+", "", years, perl=TRUE)) 

Update Da extract_numeric veraltet ist, können wir parse_number aus dem readr Paket verwenden.

 library(readr) parse_number(years) 

Hier ist eine weitere Option mit extract_numeric

 library(tidyr) extract_numeric(years) #[1] 20 1 

Du könntest auch alle Buchstaben loswerden:

 as.numeric(gsub("[[:alpha:]]", "", years)) 

Wahrscheinlich ist dies jedoch weniger verallgemeinerbar.

Oder einfach:

 as.numeric(gsub("\\D", "", years)) # [1] 20 1 

Eine stringr Pipeline-Lösung:

 library(stringr) years %>% str_match_all("[0-9]+") %>% unlist %>% as.numeric 

Extrahiere Zahlen aus einer beliebigen Zeichenfolge an der Anfangsposition.

 x < - gregexpr("^[0-9]+", years) # Numbers with any number of digits x2 <- as.numeric(unlist(regmatches(years, x))) 

Extrahiere Zahlen aus einer beliebigen Zeichenfolge UNABHÄNGIG von der Position.

 x < - gregexpr("[0-9]+", years) # Numbers with any number of digits x2 <- as.numeric(unlist(regmatches(years, x))) 

Nach dem Post von Gabor Grothendieck bei der r-help mailing list

 years< -c("20 years old", "1 years old") library(gsubfn) pat <- "[-+.e0-9]*\\d" sapply(years, function(x) strapply(x, pat, as.numeric)[[1]])