Bunun gibi bir dizem var:
years<-c("20 years old", "1 years old")
Bu vektörden sadece sayısal sayıyı grep etmek istiyorum. Beklenen çıktı bir vektördür:
c(20, 1)
Bunu nasıl yapacağım?
Bunun gibi bir dizem var:
years<-c("20 years old", "1 years old")
Bu vektörden sadece sayısal sayıyı grep etmek istiyorum. Beklenen çıktı bir vektördür:
c(20, 1)
Bunu nasıl yapacağım?
Yanıtlar:
Ne dersin
# pattern is by finding a set of numbers in the start and capturing them
as.numeric(gsub("([0-9]+).*$", "\\1", years))
veya
# pattern is to just remove _years_old
as.numeric(gsub(" years old", "", years))
veya
# split by space, get the element in first index
as.numeric(sapply(strsplit(years, " "), "[[", 1))
.*dizenin tamamını eşleştirmeniz gerektiği için gereklidir. O olmadan hiçbir şey kaldırılmaz. Ayrıca, subbunun yerine burada kullanılabileceğini unutmayın gsub.
gsub(".*?([0-9]+).*", "\\1", years)
gsub(".*?([0-9]+).*?", "\\1", "Jun. 27–30")Sonuç: [1] "2730" gsub(".*?([0-9]+)\\-.*?", "\\1", "Jun. 27–30")Sonuç: [1] "27 Haz. –30 "
Bence ikame, çözüme ulaşmanın dolaylı bir yolu. Tüm numaraları geri almak istiyorsanız şunları tavsiye ederim gregexpr:
matches <- regmatches(years, gregexpr("[[:digit:]]+", years))
as.numeric(unlist(matches))
Bir dizede birden fazla eşleşmeniz varsa, bu hepsini alacaktır. Sadece ilk maçla ilgileniyorsanız, regexpryerine kullanın gregexprve atlayabilirsiniz unlist.
gregexpr, regexprya da her ikisi?
gregexpr. regexprŞimdiye kadar denemedim . Büyük farklılık. Kullanmak regexpronu 1e6 setinde Andrew ve Arun'un çözümleri (ikinci en hızlı) arasına koyar. Belki de ilginç, subAndrew'un çözümünde kullanmak hızı iyileştirmiyor.
Güncelleme
yana extract_numericitiraz edildi, biz kullanabilirsiniz parse_numbergelen readrpaketin.
library(readr)
parse_number(years)
İşte başka bir seçenek extract_numeric
library(tidyr)
extract_numeric(years)
#[1] 20 1
parse_numbernegatif sayılarla oynamadığını unutmayın . Try parse_number("–27,633")
readr::parse_number("-12,345") # [1] -12345
Siz de tüm harflerden kurtulabilirsiniz:
as.numeric(gsub("[[:alpha:]]", "", years))
Muhtemelen bu daha az genelleştirilebilir.
Başlangıç konumundaki herhangi bir dizeden sayıları ayıklayın.
x <- gregexpr("^[0-9]+", years) # Numbers with any number of digits
x2 <- as.numeric(unlist(regmatches(years, x)))
Herhangi bir BAĞIMSIZ dizeden sayıları çıkarın.
x <- gregexpr("[0-9]+", years) # Numbers with any number of digits
x2 <- as.numeric(unlist(regmatches(years, x)))
Biz de kullanabilir str_extractdanstringr
years<-c("20 years old", "1 years old")
as.integer(stringr::str_extract(years, "\\d+"))
#[1] 20 1
Dizede birden fazla sayı varsa ve hepsini çıkarmak istiyorsak, tüm macthes'ların str_extract_allaksine olanı kullanabiliriz str_extract.
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"
Dan yazı sonrasında Gabor Grothendieck r yardım posta listesine de yazı
years<-c("20 years old", "1 years old")
library(gsubfn)
pat <- "[-+.e0-9]*\\d"
sapply(years, function(x) strapply(x, pat, as.numeric)[[1]])
Paket tutkal kullanarak şunları yapabiliriz:
# install.packages("unglue")
library(unglue)
years<-c("20 years old", "1 years old")
unglue_vec(years, "{x} years old", convert = TRUE)
#> [1] 20 1
2019-11-06 tarihinde reprex paketi tarafından oluşturuldu (v0.3.0)
Daha fazla bilgi: https://github.com/moodymudskipper/unglue/blob/master/README.md
.*gerekli? Onları başlangıçta istiyorsanız, neden kullanmayasınız^[[:digit:]]+?