मेरे पास इस तरह से स्ट्रिंग है:
years<-c("20 years old", "1 years old")
मैं इस वेक्टर से केवल संख्यात्मक संख्या को प्राप्त करना चाहूंगा। अपेक्षित आउटपुट एक वेक्टर है:
c(20, 1)
मैं यह कार्य कैसे करूं?
मेरे पास इस तरह से स्ट्रिंग है:
years<-c("20 years old", "1 years old")
मैं इस वेक्टर से केवल संख्यात्मक संख्या को प्राप्त करना चाहूंगा। अपेक्षित आउटपुट एक वेक्टर है:
c(20, 1)
मैं यह कार्य कैसे करूं?
जवाबों:
कैसा रहेगा
# pattern is by finding a set of numbers in the start and capturing them
as.numeric(gsub("([0-9]+).*$", "\\1", years))
या
# pattern is to just remove _years_old
as.numeric(gsub(" years old", "", years))
या
# split by space, get the element in first index
as.numeric(sapply(strsplit(years, " "), "[[", 1))
.*आवश्यक है क्योंकि आपको पूरे स्ट्रिंग का मिलान करने की आवश्यकता है। उसके बिना, कुछ भी नहीं हटाया जाता है। इसके अलावा, ध्यान दें कि इसके subबजाय यहाँ इस्तेमाल किया जा सकता है gsub।
gsub(".*?([0-9]+).*", "\\1", years)
gsub(".*?([0-9]+).*?", "\\1", "Jun. 27–30")परिणाम: [1] "2730" gsub(".*?([0-9]+)\\-.*?", "\\1", "Jun. 27–30")परिणाम: [1] "जून 27।" -30 "
मुझे लगता है कि प्रतिस्थापन समाधान का एक अप्रत्यक्ष तरीका है। यदि आप सभी नंबरों को पुनः प्राप्त करना चाहते हैं, तो मैं सुझाव देता हूं gregexpr:
matches <- regmatches(years, gregexpr("[[:digit:]]+", years))
as.numeric(unlist(matches))
यदि आपके पास एक स्ट्रिंग में कई मैच हैं, तो यह उन सभी को मिलेगा। यदि आप केवल पहले मैच में रुचि रखते हैं, तो regexprइसके बजाय का उपयोग करें gregexprऔर आप को छोड़ सकते हैं unlist।
gregexpr, regexprया दोनों?
gregexpr। मैंने regexprअभी तक कोशिश नहीं की थी । बड़ा अंतर। regexpr1e6 सेट पर एंड्रयूज और अरुण के समाधान (दूसरा सबसे तेज़) के बीच का उपयोग करना । शायद यह भी दिलचस्प है, subएंड्रयू के समाधान में उपयोग करने से गति में सुधार नहीं होता है।
तब से अपडेट करेंextract_numeric , हम पैकेज parse_numberसे उपयोग कर सकते हैं readr।
library(readr)
parse_number(years)
यहाँ एक और विकल्प है extract_numeric
library(tidyr)
extract_numeric(years)
#[1] 20 1
parse_numberकि नकारात्मक संख्याओं के साथ न खेलें। कोशिश parse_number("–27,633")
readr::parse_number("-12,345") # [1] -12345
आप सभी पत्रों से भी छुटकारा पा सकते हैं:
as.numeric(gsub("[[:alpha:]]", "", years))
हालांकि यह कम सामान्य है, हालांकि।
शुरुआती स्थिति में किसी भी स्ट्रिंग से नंबर निकालें।
x <- gregexpr("^[0-9]+", years) # Numbers with any number of digits
x2 <- as.numeric(unlist(regmatches(years, x)))
किसी भी स्ट्रिंग की स्थिति से संख्या निकालें।
x <- gregexpr("[0-9]+", years) # Numbers with any number of digits
x2 <- as.numeric(unlist(regmatches(years, x)))
हम str_extractसे भी उपयोग कर सकते हैंstringr
years<-c("20 years old", "1 years old")
as.integer(stringr::str_extract(years, "\\d+"))
#[1] 20 1
यदि स्ट्रिंग में कई संख्याएं हैं और हम उन सभी को निकालना चाहते हैं, तो हम उपयोग कर सकते हैं str_extract_allजो 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"
से पोस्ट करने के बाद गेबर Grothendieck आर-सहायता मेलिंग सूची पर पोस्ट
years<-c("20 years old", "1 years old")
library(gsubfn)
pat <- "[-+.e0-9]*\\d"
sapply(years, function(x) strapply(x, pat, as.numeric)[[1]])
पैकेज अनगल का उपयोग हम कर सकते हैं:
# 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 को रेप्रेक्स पैकेज (v0.3.0) द्वारा बनाया गया
अधिक जानकारी: https://github.com/moodymudskipper/unglue/blob/master/README.md
.*जरूरी है? यदि आप उन्हें शुरू में चाहते हैं, तो उपयोग क्यों नहीं करें^[[:digit:]]+?