কীভাবে আর ভেক্টরের প্রতিটি উপাদান থেকে শেষ এন অক্ষর মুছে ফেলা যায়


111

আমি আর-তে খুব নতুন, এবং কোনও ভেক্টরের প্রতিটি উপাদান থেকে কীভাবে শেষ এন অক্ষরগুলি সরিয়ে ফেলতে হয় তার সহজ উদাহরণ অনলাইনে পাই না (অ্যারে?)

আমি জাভা ব্যাকগ্রাউন্ড থেকে এসেছি, তাই আমি যা করতে চাই তা হ'ল প্রতিটি উপাদানটির পুনরাবৃত্তি করা এবং প্রতিটি উপাদান a$dataথেকে শেষ 3 টি অক্ষর মুছে ফেলা।

আপনি এটি সম্পর্কে কিভাবে যেতে হবে?

উত্তর:


120

আমি কি করতাম তার উদাহরণ এখানে। আমি আশা করি এটি আপনি যা খুঁজছেন

char_array = c("foo_bar","bar_foo","apple","beer")
a = data.frame("data"=char_array,"data2"=1:4)
a$data = substr(a$data,1,nchar(a$data)-3)

একটি এখন থাকতে হবে:

  data data2
1 foo_ 1
2 bar_ 2
3   ap 3
4    b 4

মজাদারভাবে, কাঙ্ক্ষিত প্রভাব পেতে আমাকে পরিবর্তন -3করতে -0হয়েছিল! তারিখগুলি সহ আমার প্রচুর ডেটা রয়েছে, যেমন: "2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST"- হ্যাঁ, দুটি টাইমজোন একসাথে, এবং as.Date ফাংশনটি অপ্রত্যাশিত ফলাফলগুলি ফিরিয়ে দিচ্ছে (বিএসটি তারিখের আগের দিন) - তাই আমি টাইমজোন স্ট্যাম্পটি সরিয়ে ফেলতে চেয়েছিলাম, দেখাতে হবে আমাকে করুন -0এবং এটি একসাথে কয়েক ঘন্টা
অন্তর

আরআরপিটাইম ফাংশনটিও বিবেচনা করুন, যদিও এর আগে আমি টাইম অঞ্চলগুলি ব্যবহার করি নি। আমি মনে করি এটি এটি চিনতে পারে। সম্ভবত "% Z" সময় অঞ্চলগুলি স্বীকৃতি দেয়। আমি স্যাপ্লি ফাংশনটিও সরিয়েছি। আমি ভুলে গিয়েছিলাম যে এর ফাংশনগুলিকে ভেক্টরাইজ করতে কতটা পছন্দ করে।
nfmcclure

@ লুকাসেভেরিন আপনি যদি অ্যাকাউন্টের সময় অঞ্চলগুলিতে গ্রহণের জন্য চরিত্রের সময়ের উপস্থাপনাগুলি তারিখগুলিতে রূপান্তর করতে চান তবে দয়া করে এটিকে আপনার প্রশ্নের মধ্যে সম্পাদনা করুন। সম্ভবত আরও ভাল উত্তর রয়েছে যা আপনাকে সরাসরি আপনার কাঙ্ক্ষিত ফলাফলের কাছে পাবেন (যেমন strptime)।
ব্লু ম্যাজিস্টার

86

এর সাথে এখানে একটি উপায় রয়েছে gsub:

cs <- c("foo_bar","bar_foo","apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"

4
(+1) রেগেক্সের বড় ফ্যান। এটি প্রায় সব কিছুতেই ব্যবহার করা যেতে পারে।
সমৃদ্ধ স্ক্রিভেন

8
দ্রষ্টব্য: এটি মূল স্ট্রিংটি প্রদান করে যদি এটি দীর্ঘ হয় তবে কেটে নেওয়া অক্ষরের সংখ্যা। বিবেচনা করুন gsub('.{5}$', '', 'abcd')
টমাস গ্রিফ

37

যদিও এটি @nfmcclure এর উত্তরের সাথে বেশিরভাগ ক্ষেত্রে একই, তবে আমি stringrপ্যাকেজটি ব্যবহার করতে পছন্দ করি কারণ এটি বেস ফাংশনগুলির সংখ্যার তুলনায় অনেকগুলি ধারাবাহিক এবং বর্ণনামূলক ফাংশনগুলির একটি সেটকে প্রমাণ করে (বাস্তবে আমি " সর্বদা গুগল " কীভাবে নম্বর পেতে পারি তার জন্য আর "অক্ষরগুলি যেমন আমি নামটি মনে করতে পারি না nchar())।

library(stringr)
str_sub(iris$Species, end=-4)
#or 
str_sub(iris$Species, 1, str_length(iris$Species)-3)

এটি Speciesকলামে প্রতিটি মান থেকে শেষ 3 টি অক্ষর সরিয়ে দেয় ।


23
stringrপ্যাকেজটির সাথে একটি আরও সহজ সমাধান রয়েছে: str_sub(iris$Species, end=-4)
jan-glx

14

একই স্ট্রিং প্যাকেজ সঙ্গে অর্জন করা যেতে পারে :

library('stringi')
char_array <- c("foo_bar","bar_foo","apple","beer")
a <- data.frame("data"=char_array, "data2"=1:4)
(a$data <- stri_sub(a$data, 1, -4)) # from the first to the last but 4th char
## [1] "foo_" "bar_" "ap"   "b" 

3

ব্যবহার করে @ ম্যাথহে_প্লাউডের অনুরূপ gsub

তবে এমন একটি প্যাটার্ন ব্যবহার করে যা শূন্য অক্ষরগুলিতে ছাঁটাই করবে অর্থাত্ মূল "স্ট্রিংটি অক্ষরের সংখ্যার চেয়ে ছোট হলে কাটা:

cs <- c("foo_bar","bar_foo","apple","beer","so","a")
gsub('.{0,3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"    ""    ""

পার্থক্যটি হল, {0,3}কোয়ান্টিফায়ার 0 থেকে 3 টি ম্যাচ ইঙ্গিত করে, যেখানে {3}ঠিক 3 টি ম্যাচ প্রয়োজন অন্যথায় কোনও মিল খুঁজে পাওয়া যায় না যার ক্ষেত্রে gsubআসল, অবিস্মরণীয় স্ট্রিং ফিরিয়ে দেয়।

এনবি ব্যবহার করে {,3}সমান হবে {0,3}, আমি সহজভাবে পরবর্তী চিহ্নটি পছন্দ করি।

রেজেক্স কোয়ানটিফায়ার সম্পর্কিত আরও তথ্যের জন্য এখানে দেখুন: https://www.regular-expressions.info/refrepeat.html


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