Saya memiliki string seperti ini:
years<-c("20 years old", "1 years old")
Saya hanya ingin grep nomor numerik dari vektor ini. Output yang diharapkan adalah vektor:
c(20, 1)
Bagaimana cara saya melakukan ini?
Bagaimana tentang
# pattern is by finding a set of numbers in the start and capturing them
as.numeric(gsub("([0-9]+).*$", "\\1", years))
atau
# pattern is to just remove _years_old
as.numeric(gsub(" years old", "", years))
atau
# split by space, get the element in first index
as.numeric(sapply(strsplit(years, " "), "[[", 1))
.*
perlu? Jika Anda menginginkannya di awal, mengapa tidak digunakan^[[:digit:]]+
?.*
diperlukan karena Anda harus mencocokkan seluruh string. Tanpa itu, tidak ada yang dihapus. Juga, catatan yangsub
dapat digunakan di sini sebagai penggantigsub
.gsub(".*?([0-9]+).*", "\\1", years)
gsub(".*?([0-9]+).*?", "\\1", "Jun. 27–30")
Hasil: [1] "2730"gsub(".*?([0-9]+)\\-.*?", "\\1", "Jun. 27–30")
Hasil: [1] "27 Jun. –30 "Saya pikir substitusi adalah cara tidak langsung untuk mencapai solusi. Jika Anda ingin mengambil semua nomor, saya sarankan
gregexpr
:matches <- regmatches(years, gregexpr("[[:digit:]]+", years)) as.numeric(unlist(matches))
Jika Anda memiliki beberapa kecocokan dalam satu string, ini akan mendapatkan semuanya. Jika Anda hanya tertarik pada pertandingan pertama, gunakan
regexpr
sebagai penggantigregexpr
dan Anda dapat melewatiunlist
.sumber
gregexpr
,regexpr
atau keduanya?gregexpr
. Saya belum mencobaregexpr
sampai sekarang. Perbedaan BESAR. Menggunakanregexpr
menempatkannya di antara solusi Andrew dan Arun (tercepat kedua) pada set 1e6. Mungkin juga menarik, menggunakansub
solusi Andrew tidak meningkatkan kecepatan.Perbarui Karena
extract_numeric
tidak digunakan lagi, kita dapat menggunakanparse_number
darireadr
paket.library(readr) parse_number(years)
Berikut adalah opsi lain dengan
extract_numeric
library(tidyr) extract_numeric(years) #[1] 20 1
sumber
parse_number
jangan bermain-main dengan angka negatif. Cobaparse_number("–27,633")
readr::parse_number("-12,345") # [1] -12345
Berikut alternatif solusi pertama Arun, dengan ekspresi reguler mirip Perl yang lebih sederhana:
as.numeric(gsub("[^\\d]+", "", years, perl=TRUE))
sumber
as.numeric(sub("\\D+","",years))
. Jika ada surat sebelum dan | atau sesudahnya, makagsub
Atau sederhananya:
as.numeric(gsub("\\D", "", years)) # [1] 20 1
sumber
Sebuah
stringr
solusi pipelined:library(stringr) years %>% str_match_all("[0-9]+") %>% unlist %>% as.numeric
sumber
Anda juga bisa menyingkirkan semua huruf:
as.numeric(gsub("[[:alpha:]]", "", years))
Mungkin ini kurang bisa digeneralisasikan.
sumber
Ekstrak angka dari string apa pun di posisi awal.
x <- gregexpr("^[0-9]+", years) # Numbers with any number of digits x2 <- as.numeric(unlist(regmatches(years, x)))
Ekstrak angka dari sembarang string INDEPENDEN posisi.
x <- gregexpr("[0-9]+", years) # Numbers with any number of digits x2 <- as.numeric(unlist(regmatches(years, x)))
sumber
Kami juga dapat menggunakan
str_extract
daristringr
years<-c("20 years old", "1 years old") as.integer(stringr::str_extract(years, "\\d+")) #[1] 20 1
Jika ada beberapa angka dalam string dan kami ingin mengekstrak semuanya, kami dapat menggunakan
str_extract_all
yang tidak sepertistr_extract
mengembalikan semua macthes.years<-c("20 years old and 21", "1 years old") stringr::str_extract(years, "\\d+") #[1] "20" "1" stringr::str_extract_all(years, "\\d+") #[[1]] #[1] "20" "21" #[[2]] #[1] "1"
sumber
Setelah posting dari Gabor Grothendieck posting di milis r-help
years<-c("20 years old", "1 years old") library(gsubfn) pat <- "[-+.e0-9]*\\d" sapply(years, function(x) strapply(x, pat, as.numeric)[[1]])
sumber
Menggunakan paket unglue yang bisa kita lakukan:
# install.packages("unglue") library(unglue) years<-c("20 years old", "1 years old") unglue_vec(years, "{x} years old", convert = TRUE) #> [1] 20 1
Dibuat pada 2019-11-06 oleh paket reprex (v0.3.0)
Info lebih lanjut: https://github.com/moodymudskipper/unglue/blob/master/README.md
sumber