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?
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?
Jawaban:
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))
.*diperlukan karena Anda harus mencocokkan seluruh string. Tanpa itu, tidak ada yang dihapus. Juga, catatan yang subdapat digunakan di sini sebagai pengganti gsub.
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 regexprsebagai pengganti gregexprdan Anda dapat melewati unlist.
gregexpr, regexpratau keduanya?
gregexpr. Saya belum mencoba regexprsampai sekarang. Perbedaan BESAR. Menggunakan regexprmenempatkannya di antara solusi Andrew dan Arun (tercepat kedua) pada set 1e6. Mungkin juga menarik, menggunakan subsolusi Andrew tidak meningkatkan kecepatan.
Perbarui
Karena extract_numerictidak digunakan lagi, kita dapat menggunakan parse_numberdari readrpaket.
library(readr)
parse_number(years)
Berikut adalah opsi lain dengan extract_numeric
library(tidyr)
extract_numeric(years)
#[1] 20 1
parse_numberjangan bermain-main dengan angka negatif. Coba parse_number("–27,633")
readr::parse_number("-12,345") # [1] -12345
Anda juga bisa menyingkirkan semua huruf:
as.numeric(gsub("[[:alpha:]]", "", years))
Mungkin ini kurang bisa digeneralisasikan.
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)))
Kami juga dapat menggunakan str_extractdaristringr
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_allyang tidak seperti str_extractmengembalikan 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"
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]])
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
.*perlu? Jika Anda menginginkannya di awal, mengapa tidak digunakan^[[:digit:]]+?