আমার মতো স্ট্রিং রয়েছে:
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এখন পর্যন্ত চেষ্টা করিনি । বিশাল পার্থক্য. ব্যবহার regexprএকটি 1e6 সেটে এন্ড্রুর এবং অরুণ এর সমাধান (দ্বিতীয় দ্রুততম) মধ্যে রাখে এটা। সম্ভবত আকর্ষণীয়, subঅ্যান্ড্রু এর সমাধান ব্যবহার করে গতির উন্নতি হয় না।
আপডেট
যেহেতু extract_numericঅবহেলিত, আমরা প্যাকেজ parse_numberথেকে ব্যবহার করতে পারি readr।
library(readr)
parse_number(years)
এখানে আরও একটি বিকল্প রয়েছে extract_numeric
library(tidyr)
extract_numeric(years)
#[1] 20 1
parse_numbernegativeণাত্মক সংখ্যার সাথে খেলবেন না। চেষ্টা করুন parse_number("–27,633")
readr::parse_number("-12,345") # [1] -12345
এখানে পার্লের মতো সাধারণ নিয়মিত অভিব্যক্তি সহ অরুণের প্রথম সমাধানের বিকল্প রয়েছে:
as.numeric(gsub("[^\\d]+", "", years, perl=TRUE))
as.numeric(sub("\\D+","",years))। যদি আগে এবং | বা পরে চিঠিগুলি থাকে তবেgsub
একটি stringrপাইপযুক্ত সমাধান:
library(stringr)
years %>% str_match_all("[0-9]+") %>% unlist %>% as.numeric
আপনি সমস্ত চিঠিগুলি থেকেও মুক্তি পেতে পারেন:
as.numeric(gsub("[[:alpha:]]", "", years))
সম্ভবত এটি যদিও কম সাধারণীকরণযোগ্য।
প্রারম্ভিক অবস্থানে যে কোনও স্ট্রিং থেকে সংখ্যাগুলি বের করুন।
x <- gregexpr("^[0-9]+", years) # Numbers with any number of digits
x2 <- as.numeric(unlist(regmatches(years, x)))
অবস্থানের যে কোনও স্ট্রিং INDEPendENT থেকে সংখ্যাগুলি বের করুন।
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"
থেকে পোস্ট করার পর নেই Gábor Grothendieck R-সাহায্যের মেইলিং লিস্ট পোস্ট
years<-c("20 years old", "1 years old")
library(gsubfn)
pat <- "[-+.e0-9]*\\d"
sapply(years, function(x) strapply(x, pat, as.numeric)[[1]])
প্যাকেজের সাহায্যে unglue আমরা কি করতে পারি:
# 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:]]+করবেন না ?