तारों के वैक्टर से नंबर निकालना


101

मेरे पास इस तरह से स्ट्रिंग है:

years<-c("20 years old", "1 years old")

मैं इस वेक्टर से केवल संख्यात्मक संख्या को प्राप्त करना चाहूंगा। अपेक्षित आउटपुट एक वेक्टर है:

c(20, 1)

मैं यह कार्य कैसे करूं?

जवाबों:


83

कैसा रहेगा

# 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))

1
क्यों .*जरूरी है? यदि आप उन्हें शुरू में चाहते हैं, तो उपयोग क्यों नहीं करें ^[[:digit:]]+?
सेबस्टियन-सी

2
.*आवश्यक है क्योंकि आपको पूरे स्ट्रिंग का मिलान करने की आवश्यकता है। उसके बिना, कुछ भी नहीं हटाया जाता है। इसके अलावा, ध्यान दें कि इसके subबजाय यहाँ इस्तेमाल किया जा सकता है gsub
मैथ्यू लुंडबर्ग

12
यदि संख्या को स्ट्रिंग की शुरुआत में नहीं होना है, तो इसका उपयोग करें:gsub(".*?([0-9]+).*", "\\1", years)
TMS

मैं 27 प्राप्त करना चाहता हूं। मुझे समझ में नहीं आता है, शर्तों को जोड़कर (जैसे कि एक बच गए "-" को जोड़ने से, परिणाम लंबा हो जाता है ... gsub(".*?([0-9]+).*?", "\\1", "Jun. 27–30")परिणाम: [1] "2730" gsub(".*?([0-9]+)\\-.*?", "\\1", "Jun. 27–30")परिणाम: [1] "जून 27।" -30 "
लियोनेल ट्रेबुचॉन

65

मुझे लगता है कि प्रतिस्थापन समाधान का एक अप्रत्यक्ष तरीका है। यदि आप सभी नंबरों को पुनः प्राप्त करना चाहते हैं, तो मैं सुझाव देता हूं gregexpr:

matches <- regmatches(years, gregexpr("[[:digit:]]+", years))
as.numeric(unlist(matches))

यदि आपके पास एक स्ट्रिंग में कई मैच हैं, तो यह उन सभी को मिलेगा। यदि आप केवल पहले मैच में रुचि रखते हैं, तो regexprइसके बजाय का उपयोग करें gregexprऔर आप को छोड़ सकते हैं unlist


1
मुझे इसकी उम्मीद नहीं थी, लेकिन परिमाण के क्रम से यह समाधान दूसरों की तुलना में धीमा है।
मैथ्यू लुंडबर्ग

@MatthewLundberg द gregexpr, regexprया दोनों?
सेबस्टियन-सी

1
gregexpr। मैंने regexprअभी तक कोशिश नहीं की थी । बड़ा अंतर। regexpr1e6 सेट पर एंड्रयूज और अरुण के समाधान (दूसरा सबसे तेज़) के बीच का उपयोग करना । शायद यह भी दिलचस्प है, subएंड्रयू के समाधान में उपयोग करने से गति में सुधार नहीं होता है।
मैथ्यू लुंडबर्ग

यह दशमलव बिंदुओं के आधार पर विभाजित होता है। उदाहरण के लिए 2.5 c ('2', '5') बन जाता है
MBorg

65

तब से अपडेट करेंextract_numeric , हम पैकेज parse_numberसे उपयोग कर सकते हैं readr

library(readr)
parse_number(years)

यहाँ एक और विकल्प है extract_numeric

library(tidyr)
extract_numeric(years)
#[1] 20  1

2
इस एप्लिकेशन के लिए ठीक है लेकिन ध्यान रखें parse_numberकि नकारात्मक संख्याओं के साथ न खेलें। कोशिश parse_number("–27,633")
नेटल

@ जेटली हां, यह सही है और यह काम नहीं करेगा यदि कई उदाहरण भी हैं
अक्रूर

3
ऋणात्मक संख्या पार्सिंग बग को ठीक कर दिया गया है: github.com/tidyverse/readr/issues/308 readr::parse_number("-12,345") # [1] -12345
Russ Hyde

35

यहाँ अरुण के पहले समाधान का एक विकल्प है, एक सरल पर्ल की तरह नियमित अभिव्यक्ति:

as.numeric(gsub("[^\\d]+", "", years, perl=TRUE))

as.numeric(sub("\\D+","",years))। यदि पहले और / या बाद में पत्र थे, तोgsub
ओन्यम्बु


19

एक stringrपाइपलाइन समाधान:

library(stringr)
years %>% str_match_all("[0-9]+") %>% unlist %>% as.numeric

धन्यवाद जो, लेकिन यह उत्तर स्ट्रिंग में संख्याओं से पहले नकारात्मक संकेतों को नहीं निकालता है।
मियाओ कै

16

आप सभी पत्रों से भी छुटकारा पा सकते हैं:

as.numeric(gsub("[[:alpha:]]", "", years))

हालांकि यह कम सामान्य है, हालांकि।


3
अजीब तरह से, एंड्रयू का समाधान मेरी मशीन पर 5 के एक कारक द्वारा धड़कता है।
मैथ्यू लुंडबर्ग

5

शुरुआती स्थिति में किसी भी स्ट्रिंग से नंबर निकालें।

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)))

4

हम 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"


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.