একটি স্ট্রিংয়ের অংশটি সরান


90

আমি একটি স্ট্রিংয়ের অংশটি কীভাবে সরিয়ে ফেলব? উদাহরণস্বরূপ ATGAS_1121আমি আগে সবকিছু মুছে ফেলতে চাই _

উত্তর:


131

নিয়মিত এক্সপ্রেশন ব্যবহার করুন। এই ক্ষেত্রে, আপনি ব্যবহার করতে পারেন gsub:

gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"

এই নিয়মিত অভিব্যক্তিটি স্ট্রিং (^) এর শুরুর সাথে, কোনও বর্ণ (।) শূন্য বা তার বেশি বার (*) এবং আন্ডারস্কোর (_) এর সাথে মেলে। দ্য ? ম্যাচটিকে "অলস" করে তোলে যাতে এটি কেবল ম্যাচগুলি প্রথম আন্ডারস্কোরের থেকে অনেক দূরে। এই ম্যাচটি কেবল একটি আন্ডারস্কোর দিয়ে প্রতিস্থাপন করা হয়। দেখুন ?regexআরো বিস্তারিত জানার এবং তথ্যসূত্র জন্য


6
পূর্ববর্তী রেজেক্সটি শেষ আন্ডারস্কোরের সাথে মেলে, যেমন gsub("^.*_","_","ATGAS_1121_xxx"),। এখন স্থির।
রিচি কটন

7
@ জোশুয়া আমি সত্যিই দরকারী মনে করি যে আপনি নিয়মিত প্রকাশের ভূমিকা ব্যাখ্যা করেছিলেন।
ভ্যাসিল

এটি সর্বশেষ যুক্তি হিসাবে স্ট্রিংয়ের ভেক্টরের সাথেও কাজ করে। আর এর মত দুর্দান্ত।
nnot101

37

আপনি এর জন্য একটি অন্তর্নির্মিত ব্যবহার করতে পারেন, স্টারস্প্লিট :

> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1    
 [1] "1121"

স্টারস্প্লিট স্প্লিট প্যারামিটারে পার্সযুক্ত স্ট্রিংয়ের উভয় টুকরোকে তালিকা হিসাবে ফিরিয়ে দেয় । এটি সম্ভবত আপনি যা চান তা নয়, সুতরাং কলটিকে তালিকাভুক্তিতে মোড়ক করুন , তারপরে সেই অ্যারেটিকে সূচক করুন যাতে ভেক্টরের দুটি উপাদানগুলির মধ্যে কেবল দ্বিতীয়টিই ফিরে আসে।

অবশেষে, স্পষ্ট প্যারামিটারটি নিয়মিত প্রকাশ নয়, তবে আক্ষরিক মিলের অক্ষর হিসাবে চিহ্নিত করতে নির্দিষ্ট প্যারামিটারটি সত্য হিসাবে সেট করা উচিত।


23

আপনি যদি একটি পরিশ্রমী ধরণের ব্যক্তি হন তবে এখানে স্ট্রিংয়ের সমাধান রয়েছে:

R> library(stringr)
R> strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
R> strings %>% str_replace(".*_", "_")
[1] "_1121" "_1432" "_1121"
# Or:
R> strings %>% str_replace("^[A-Z]*", "")
[1] "_1121" "_1432" "_1121"

21

ভেক্টর strsplitহলে এখানে সমাধানটি দেওয়া sহল:

> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"

4
খুব সহায়ক, ধন্যবাদ! এফওয়াইআই স্ট্রিংয়ের প্রথম অংশটি পেতে (যেমন '_' এর আগে), [2] এর শেষে একটি [1] দিয়ে প্রতিস্থাপন করুন।
স্টিভেনজো

4

সম্ভবত সবচেয়ে স্বজ্ঞাত সমাধানটি stringrফাংশনটি ব্যবহার করা str_removeযা str_replace2 এর পরিবর্তে কেবলমাত্র 1 টি যুক্তি রয়েছে বলে এটি আরও সহজ than

আপনার উদাহরণের একমাত্র কৌতুকপূর্ণ অংশটি হ'ল আপনি আন্ডারস্কোরটি রাখতে চান তবে এটি সম্ভব: নির্দিষ্ট স্ট্রিং প্যাটার্নটি না পাওয়া পর্যন্ত আপনাকে অবশ্যই নিয়মিত এক্সপ্রেশনটি মেলাতে হবে (?=pattern)

উদাহরণ দেখুন:

strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")

[1] "_1121" "_1432" "_1121"

3

প্যাকেজ strsplitব্যবহার করে ডেটা ফ্রেমের সমাধান এখানেdplyr

col1 = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
col2 = c("T", "M", "A") 
df = data.frame(col1, col2)
df
        col1 col2
1  TGAS_1121    T
2  MGAS_1432    M
3 ATGAS_1121    A

df<-mutate(df,col1=as.character(col1))
df2<-mutate(df,col1=sapply(strsplit(df$col1, split='_', fixed=TRUE),function(x) (x[2])))
df2

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