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 sub
dapat 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 regexpr
sebagai pengganti gregexpr
dan Anda dapat melewati unlist
.
gregexpr
, regexpr
atau keduanya?
gregexpr
. Saya belum mencoba regexpr
sampai sekarang. Perbedaan BESAR. Menggunakan regexpr
menempatkannya di antara solusi Andrew dan Arun (tercepat kedua) pada set 1e6. Mungkin juga menarik, menggunakan sub
solusi Andrew tidak meningkatkan kecepatan.
Perbarui
Karena extract_numeric
tidak digunakan lagi, kita dapat menggunakan parse_number
dari readr
paket.
library(readr)
parse_number(years)
Berikut adalah opsi lain dengan extract_numeric
library(tidyr)
extract_numeric(years)
#[1] 20 1
parse_number
jangan 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_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 seperti str_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"
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:]]+
?