স্ট্রিংয়ের ভেক্টর থেকে সংখ্যা বের করা


103

আমার মতো স্ট্রিং রয়েছে:

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

আমি এই ভেক্টর থেকে কেবল সংখ্যা সংখ্যাটি গ্রেপ করতে চাই। প্রত্যাশিত আউটপুটটি একটি ভেক্টর:

c(20, 1)

কিভাবে আমি এই কাজ সম্পর্কে যান?

উত্তর:


87

কেমন

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

4
কেন .*প্রয়োজনীয়? আপনি যদি এগুলি শুরুতে চান তবে কেন ব্যবহার ^[[:digit:]]+করবেন না ?
সেবাস্তিয়ান-সি

4
.*আপনার প্রয়োজন পুরো স্ট্রিংয়ের সাথে মিলে যাওয়ার জন্য। তা ছাড়া কিছুই অপসারণ করা হয় না। এছাড়াও, নোট যে subপরিবর্তে এখানে ব্যবহার করা যেতে পারে gsub
ম্যাথু লুন্ডবার্গ ২

14
যদি নম্বরটি স্ট্রিংয়ের শুরুতে না হয়, এটি ব্যবহার করুন:gsub(".*?([0-9]+).*", "\\1", years)
টিএমএস

আমি ২ get পেতে চাই why আমি বুঝতে পারি না কেন, শর্ত যুক্ত করে (যেমন পালিয়ে যাওয়া "-" যোগ করে ফলাফলটি দীর্ঘ হয় ... gsub(".*?([0-9]+).*?", "\\1", "Jun. 27–30")ফলাফল: [1] "2730" gsub(".*?([0-9]+)\\-.*?", "\\1", "Jun. 27–30")ফলাফল: [1] "২ জুন ২ 27) –30 "
লিওনেল ট্রেবুচন

66

আমি মনে করি যে বিকল্পটি সমাধানে পাওয়ার অপ্রত্যক্ষ উপায়। আপনি যদি সমস্ত নম্বর পুনরুদ্ধার করতে চান তবে আমি প্রস্তাব দিই gregexpr:

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

আপনার যদি স্ট্রিংয়ে একাধিক মিল থাকে তবে এটি সমস্তই পাবেন। যদি আপনি কেবল প্রথম ম্যাচে আগ্রহী হন, regexprপরিবর্তে ব্যবহার করুন gregexprএবং আপনি এড়িয়ে যেতে পারেন unlist


4
আমি এটি আশা করিনি, তবে এই সমাধানটি অন্যের তুলনায় ধীর গতির, একটি আকারের ক্রম অনুসারে।
ম্যাথু লুন্ডবার্গ

@ ম্যাথেল লন্ডবার্গ gregexpr, regexprনা উভয়?
সেবাস্তিয়ান-সি

4
gregexpr। আমি regexprএখন পর্যন্ত চেষ্টা করিনি । বিশাল পার্থক্য. ব্যবহার regexprএকটি 1e6 সেটে এন্ড্রুর এবং অরুণ এর সমাধান (দ্বিতীয় দ্রুততম) মধ্যে রাখে এটা। সম্ভবত আকর্ষণীয়, subঅ্যান্ড্রু এর সমাধান ব্যবহার করে গতির উন্নতি হয় না।
ম্যাথু লুন্ডবার্গ

দশমিক পয়েন্টের উপর ভিত্তি করে এই বিভক্ত হয়। উদাহরণস্বরূপ 2.5 গ ('2', '5') হয়ে যায়
এমবির্গ

66

আপডেট যেহেতু extract_numericঅবহেলিত, আমরা প্যাকেজ parse_numberথেকে ব্যবহার করতে পারি readr

library(readr)
parse_number(years)

এখানে আরও একটি বিকল্প রয়েছে extract_numeric

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

4
এই অ্যাপ্লিকেশনটির জন্য সূক্ষ্ম তবে মনে রাখবেন parse_numbernegativeণাত্মক সংখ্যার সাথে খেলবেন না। চেষ্টা করুন parse_number("–27,633")
নেটলেট

@ নেটল হ্যাঁ, এটি ঠিক আছে এবং একাধিক উদাহরণ থাকলে এটি কাজ করবে না
আকরুন

4
The ণাত্মক -সংখ্যা পার্সিং বাগটি ঠিক করা হয়েছে: github.com/tidyverse/readr/issues/308readr::parse_number("-12,345") # [1] -12345
রাশ হাইড

35

এখানে পার্লের মতো সাধারণ নিয়মিত অভিব্যক্তি সহ অরুণের প্রথম সমাধানের বিকল্প রয়েছে:

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

as.numeric(sub("\\D+","",years))। যদি আগে এবং | বা পরে চিঠিগুলি থাকে তবেgsub
ওনাম্বু

21

বা সহজভাবে:

as.numeric(gsub("\\D", "", years))
# [1] 20  1

19

একটি stringrপাইপযুক্ত সমাধান:

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

ধন্যবাদ জো, তবে এই উত্তরটি স্ট্রিংয়ের সংখ্যার আগে নেতিবাচক লক্ষণগুলি বের করে না।
মিয়াও ক্যা

16

আপনি সমস্ত চিঠিগুলি থেকেও মুক্তি পেতে পারেন:

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

সম্ভবত এটি যদিও কম সাধারণীকরণযোগ্য।


4
অদ্ভুতভাবে, অ্যান্ড্রু এর সমাধানটি আমার মেশিনে 5 এর ফ্যাক্টর দ্বারা প্রহার করে।
ম্যাথু লুন্ডবার্গ

5

প্রারম্ভিক অবস্থানে যে কোনও স্ট্রিং থেকে সংখ্যাগুলি বের করুন।

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

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"


2

প্যাকেজের সাহায্যে 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.