Ich habe eine Zeichenfolge wie diese:
years<-c("20 years old", "1 years old")
Ich möchte nur die numerische Zahl aus diesem Vektor erfassen. Die erwartete Ausgabe ist ein Vektor:
c(20, 1)
Wie mache ich das?
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))
.*
notwendig? Wenn Sie sie am Anfang haben möchten, warum nicht verwenden^[[:digit:]]+
?.*
ist erforderlich, da Sie die gesamte Zeichenfolge abgleichen müssen. Ohne das wird nichts entfernt. Beachten Sie auch, dasssub
hier anstelle von verwendet werden kanngsub
.gsub(".*?([0-9]+).*", "\\1", years)
gsub(".*?([0-9]+).*?", "\\1", "Jun. 27–30")
Ergebnis: [1] "2730"gsub(".*?([0-9]+)\\-.*?", "\\1", "Jun. 27–30")
Ergebnis: [1] "27. Juni –30 "Ich denke, dass Substitution ein indirekter Weg ist, um zur Lösung zu gelangen. Wenn Sie alle Nummern abrufen möchten, empfehle ich
gregexpr
:Wenn Sie mehrere Übereinstimmungen in einer Zeichenfolge haben, werden alle diese erhalten. Wenn Sie nur am ersten Spiel interessiert sind, verwenden Sie
regexpr
stattdessengregexpr
und Sie können das überspringenunlist
.quelle
gregexpr
,regexpr
oder beides?gregexpr
. Ich hatte esregexpr
bis jetzt nicht versucht . RIESIGER Unterschied. Mitregexpr
setzt es zwischen Andrews und Aruns Lösungen (zweitschnellste) auf einem 1e6-Set. Vielleicht auch interessant, die Verwendungsub
in Andrews Lösung verbessert die Geschwindigkeit nicht.Update Da
extract_numeric
veraltet ist, können wirparse_number
ausreadr
Paket verwenden.Hier ist eine weitere Option mit
extract_numeric
quelle
parse_number
spielt nicht mit negativen Zahlen. Versuchen Sieparse_number("–27,633")
readr::parse_number("-12,345") # [1] -12345
Hier ist eine Alternative zu Aruns erster Lösung mit einem einfacheren Perl-ähnlichen regulären Ausdruck:
quelle
as.numeric(sub("\\D+","",years))
. Wenn es vorher und nachher Briefe gab, danngsub
Oder einfach:
quelle
Eine
stringr
Pipeline-Lösung:quelle
Sie könnten auch alle Buchstaben loswerden:
Wahrscheinlich ist dies jedoch weniger verallgemeinerbar.
quelle
Extrahieren Sie Zahlen aus einer beliebigen Zeichenfolge an der Anfangsposition.
Extrahieren Sie Zahlen aus einer beliebigen Zeichenfolge, die von der Position UNABHÄNGIG ist.
quelle
Wir können auch
str_extract
von verwendenstringr
Wenn die Zeichenfolge mehrere Zahlen enthält und wir alle extrahieren möchten, können wir verwenden,
str_extract_all
die im Gegensatz zustr_extract
allen Zahlen alle Macthes zurückgeben.quelle
Nach dem Beitrag von Gabor Grothendieck auf der R-Hilfe-Mailingliste
quelle
Mit dem Paket Kleber können wir Folgendes tun:
Erstellt am 06.11.2019 durch das reprex-Paket (v0.3.0)
Weitere Informationen: https://github.com/moodymudskipper/unglue/blob/master/README.md
quelle