কোনও ভেক্টরে কোনও উপাদানটির সূচকগুলি খুঁজে পাওয়ার জন্য কোনও আর ফাংশন রয়েছে?


324

আর-তে আমার একটি উপাদান xএবং ভেক্টর রয়েছে v। আমি এটির vসমান একটি উপাদানের প্রথম সূচকটি খুঁজতে চাই x। আমি জানি যে এটির একটি উপায় হ'ল: which(x == v)[[1]]তবে এটি অত্যধিক অদক্ষ বলে মনে হচ্ছে। এটি করার আরও প্রত্যক্ষ উপায় আছে কি?

বোনাস পয়েন্টগুলির জন্য, কোনও ফাংশন রয়েছে যা xভেক্টর হলে কাজ করে ? অর্থাৎ প্রতিটি উপাদান অবস্থান ইঙ্গিত সূচকের একটি ভেক্টর ফেরত পাঠাবেন xমধ্যে v


যেহেতু আর ভেক্টরগুলির সাথে কাজ করার জন্য অনুকূলিত, which(x == v)[[1]]তাই খুব অদক্ষ নয়। এটি একটি তুলনা ( ==) অপারেটর সমস্ত ভেক্টর উপাদানগুলিতে প্রয়োগ করা হয় এবং সূচকগুলিতে একটি উপসেটিং ( which)। এটাই. প্রাসঙ্গিক হওয়া উচিত এমন কিছুই, যতক্ষণ না আপনি এই ফাংশনে 10.000 পুনরাবৃত্তি চালাচ্ছেন না। অন্যান্য সমাধানের পছন্দ matchএবং Positionহিসাবে অনেক তথ্য হিসাবে আসতে নাও হতে পারে which, কিন্তু তারা অগত্যা আরো দক্ষ নন।
বার্নিনলিও

2
আমার প্রশ্নে উল্লেখ করা হয়েছে যে আমি এমন কোনও ক্রিয়াকে পছন্দ করব যা এক্স এর উপর ভেক্টরাইজড ছিল, এবং which(x == v)[[1]]তা নয়।
রায়ান সি থমসন

উত্তর:


461

ফাংশনটি matchভেক্টরগুলিতে কাজ করে:

x <- sample(1:10)
x
# [1]  4  5  9  3  8  1  6 10  7  2
match(c(4,8),x)
# [1] 1 5

matchআপনার অনুরোধ অনুসারে কেবল ম্যাচের প্রথম মুখোমুখি ফিরিয়ে দেয়। এটি প্রথম যুক্তিতে মানগুলির দ্বিতীয় যুক্তিতে অবস্থানটি প্রদান করে।

একাধিক মিলের জন্য, %in%যাওয়ার উপায়:

x <- sample(1:4,10,replace=TRUE)
x
# [1] 3 4 3 3 2 3 1 1 2 2
which(x %in% c(2,4))
# [1]  2  5  9 10

%in%প্রথম আর্গুমেন্ট হিসাবে লজিক্যাল ভেক্টরকে প্রদান করে, TRUEযদি সেই মানটি দ্বিতীয় তর্ক এবং FALSEঅন্যথায় পাওয়া যায় ।


আমি মনে করি যে সি (2,3,3) এবং সি (1,2,3,4) এর সাথে একটি মিল এবং% 2% উভয়ই উদাহরণের মধ্যে কম পরিবর্তনের সাথে আরও শিক্ষণীয় হবে। ম্যাচ (সি (২,৩,৩), সি (১: ৪) বিভিন্ন লম্বা প্রথম ভেক্টরের প্রয়োজন ছাড়াই এবং (সি: ২,৩,৩)% সি (১: ৪) এর মধ্যে বিভিন্ন ফলাফল প্রদান করে উদাহরণ থেকে উদাহরণস্বরূপ অনেক পরিবর্তন। এগুলিও লক্ষণীয় যে তারা নন-ম্যাচগুলি খুব আলাদাভাবে পরিচালনা করে।
জন

1
@ জন: এগুলি সবই সত্য, তবে ওপি যা বলেছিল তা নয়। অপারেটিং সিস্টেমটি দীর্ঘ ভেক্টর থেকে শুরু করে অন্য একটিতে দেওয়া উপাদানগুলির প্রথম ম্যাচটি খুঁজতে বলেছিল। এবং সম্পূর্ণতার জন্য, আমি যোগ করেছি যে আপনি যদি সমস্ত সূচকগুলিতে আগ্রহী হন তবে আপনাকে কোনটি (%%) ব্যবহার করতে হবে। বিটিডাব্লু, আপনার উত্তর মোছার কোনও কারণ নেই। এটি বৈধ তথ্য।
জোরিস মাইস

1
আমি মনে করি এটি চাপ দেওয়া সহায়ক হবে যে matchআপনি যদি প্রথম ঘটনার সূচি চান তবে বিষয়গুলিতে যুক্তিগুলির ক্রম । আপনার উদাহরণস্বরূপ, match(x,c(4,8))বিভিন্ন ফলাফল দেয়, যা প্রথমে সুপার স্পষ্ট নয়।
এপিটসচ

@goldenoslik এটির সাহায্যে আপনি সাহায্যে পাতা পড়া match। এটি সমস্ত এখানে ব্যাখ্যা করা হয়েছে। কিন্তু আমি তথ্য টুকরা যোগ।
জোরিস মেজ

ধন্যবাদ! এই সমাধান আমার দিন বাঁচায়!
জিনহুয়া ওয়াং

26

ফাংশন Positionfunprog {বেস} এ পেশা আছে। এটি আপনাকে একটি স্বেচ্ছাসেবী ফাংশন পাস করার অনুমতি দেয় এবং প্রথম বা শেষ ম্যাচটি দেয়।

Position(f, x, right = FALSE, nomatch = NA_integer)


10

উপরোক্ত পদ্ধতিগুলির দক্ষতা সম্পর্কে একটি ছোট নোট:

 library(microbenchmark)

  microbenchmark(
    which("Feb" == month.abb)[[1]],
    which(month.abb %in% "Feb"))

  Unit: nanoseconds
   min     lq    mean median     uq  max neval
   891  979.0 1098.00   1031 1135.5 3693   100
   1052 1175.5 1339.74   1235 1390.0 7399  100

সুতরাং, সেরা এক

    which("Feb" == month.abb)[[1]]

আপনার মানদণ্ডটি দৈর্ঘ্যের 12 ভেক্টরের উপর ভিত্তি করে এবং তাই অর্থবহ নয়। এছাড়াও আপনার উদাহরণে which("Feb" == month.abb)ফেরত - 2কেন [[1]]?
মার্কাস

@ মার্কাস এই কোড যা ("ফেব্রুয়ারী" == মাস.abb) [[1]] "2" প্রদান করে এবং এই কোডটি ("ফেব্রুয়ারী" তে মাসিক অ্যাববি%) "2 "ও ফেরত দেয়। এছাড়াও, কেন ভেক্টর ব্যবহার অর্থপূর্ণ নয় তা পরিষ্কার নয়
Andrii

1
এটি ভেক্টর সম্পর্কে নয়, এটির দৈর্ঘ্য সম্পর্কে। আপনার যথাযথ দৈর্ঘ্যের একটি ভেক্টর তৈরি করা উচিত এবং তারপরে একটি বেঞ্চমার্ক করা উচিত। Ops প্রশ্নটি থেকে বরাত দিয়ে "আমি জানি যে এক উপায় এই কাজ করতে হয়: which(x == v)[[1]] , । কিন্তু যে বেজায় অদক্ষ বলে মনে হয়"
মার্কাস

-5

আর ==একটি ভেক্টর খড়ের খাঁজে সূঁচের সূচক খুঁজে বের করার পদ্ধতির সাহায্যে ডাবল সমান অপারেটরটি ওভারলোড হয়েছে ed এটি খড়খড়ের প্রতিটি ম্যাচের মান সহ একটি logicalভেক্টর TRUEদেয় yield

উদাহরণ:

haystack <- c(1, 2, 4, 3, 4)
needle <- 4
indices <- needle == haystack
indices
[1] 3  5
haystack[indices]
[1] 4  4

উভয় ভেক্টর হলে এটি কাজ করে এবং একাধিক ভেক্টর পাশাপাশি ব্যবহার করতে প্রসারিত হতে পারে।


2
==অপারেটর ইতিমধ্যে একটি অদক্ষ সমাধান সূঁচ একটি ভেক্টর সাথে কাজ করে না আমার প্রশ্নে উল্লেখ করা হয়েছে।
রায়ান সি থম্পসন

"এটি উভয় ভেক্টর হলে এটি কাজ করে" - হতে পারে, আপনি কী বোঝাতে চেয়েছেন তার উপর নির্ভর করে ... তবে ওপি যে অর্থে চেয়েছিল তা নয়।
ফ্রাঙ্ক

30
আমি FALSE FALSE TRUE FALSE TRUEএই উদাহরণে সূচকগুলির পরিবর্তে পাই
সাশকো লাইখেনকো

6
আপনি আর এটিকে কখনই চালান নি ==কোনও সূচিকাগত ভেক্টরকে ফেরত দেয়, সূচকগুলি নয়। তার জন্য আপনার প্রয়োজন which(), আমি 7 বছর আগে ব্যাখ্যা করেছি।
জোরিস মেয়েস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.