আমি কীভাবে অন্য ভেক্টরকে অন্যের মানের উপর ভিত্তি করে সাজান


112

আমার একটি ভেক্টর এক্স রয়েছে যে আমি ভেক্টর ওয়াইয়ের মানগুলির ক্রমের ভিত্তিতে বাছাই করতে চাই। দুটি ভেক্টর একই দৈর্ঘ্যের নয়।

x <- c(2, 2, 3, 4, 1, 4, 4, 3, 3)
y <- c(4, 2, 1, 3)

প্রত্যাশিত ফলাফল হবে:

[1] 4 4 4 2 2 1 3 3 3

উত্তর:


70

এখানে একটি ওলাইনার ...

y[sort(order(y)[x])]

[সম্পাদনা:] এটি নীচে হিসাবে বিরতি:

order(y)             #We want to sort by y, so order() gives us the sorting order
order(y)[x]          #looks up the sorting order for each x
sort(order(y)[x])    #sorts by that order
y[sort(order(y)[x])] #converts orders back to numbers from orders

1
এটি খুব সংক্ষিপ্ত, তবে সেখানে কী চলছে তা নির্ধারণ করতে আমার খুব কষ্ট হচ্ছে। আপনি কিছুটা ব্যাখ্যা করতে পারেন?
ম্যাট পার্কার 22

3
এটি সুন্দর এবং আর-এর বিল্ট-ইনগুলি সম্পর্কে ভাল বোঝার দেখায়। +1
গোদেকে

6
Y 1: দৈর্ঘ্য (y) এর অনুক্রম না হলেও সাধারণভাবে এটি করতে পারে। সেক্ষেত্রে এই সমাধানটি কাজ করে না, তবে gd047 এর সমাধান নীচে x [অর্ডার (ম্যাচ (এক্স, y))] করে,
রাহুল সাভানী

5
আমি কেন এটির 40 টি উর্ধ্বতন রয়েছে তা নিয়ে আসলেই বিস্মিত। এটি এ xএবং এতগুলি সহজ প্রকরণের জন্য ব্যর্থ yx <- c(1,4,2); y <- c(1,2,4)এই ক্ষেত্রে.
thelatemail

1
@ থ্যালিটেল আমি সম্মত উন্মাদনা বন্ধ করুন এবং এই উত্তরটিকে হ্রাস করুন!
ইয়ান ফেলো

184

এটা কেমন

x[order(match(x,y))]

29
এটি খুব সাধারণ, গ্রহণযোগ্য উত্তর আইএমএইচওর চেয়ে বেশি ভাল কারণ এটি সাধারণ।
fmark

2
আমি যতদূর বলি এটি জিএনইউ-আর বেসে থাকা উচিত।
-এ বিপর্যয়-ব্যর্থতা

এক্স এবং y উভয় ক্ষেত্রে চরিত্রের ভেক্টর ব্যবহার করার সময় এই উত্তরটি আমার পক্ষে ভাল কাজ করেছে। গৃহীত উত্তরের মতো পচন / সামান্য বিস্তৃতি যুক্ত করা ভাল হবে
ম্যাভারিক্স

4

আপনি xএকটি আদেশযুক্ত ফ্যাক্টারে রূপান্তর করতে পারেন :

x.factor <- factor(x, levels = y, ordered=TRUE)
sort(x)
sort(x.factor)

একথাও ঠিক যে, কারণের মধ্যে আপনার নম্বর পরিবর্তন আমূল পথ কোডে স্রোতবরাবর ক্ষীণভাবে প্রতিক্রিয়া পরিবর্তন করতে পারেন x। তবে যেহেতু আপনি আমাদের পরবর্তী ঘটনাটি সম্পর্কে কোনও প্রসঙ্গ দেন নি, তাই আমি ভেবেছিলাম এটি বিকল্প হিসাবে প্রস্তাব করব।


1
এটি সেরা উত্তর হওয়া উচিত যেহেতু এটি পূর্ণসংখ্যার ক্ষেত্রে ক্ষেত্রে কাজ করে না; বা যখন সামান্য পরিবর্তনের সাথে xবাছাই করা ভেক্টরে মান না থাকে তখনও কাজ করুন y:x <- c(2, 2, 3, 4, 1, 4, 4, 3, 3, 6); y <- c(4, 2, 1, 3); as.numeric(as.character(sort(factor(x, unique(c(y, x))))))
কাঁচার


2

আপনার যদি "y" এর অর্ডার পাওয়া দরকার তবে এটির সংখ্যা বা অক্ষর নির্বিশেষে:

x[order(ordered(x, levels = y))]
4 4 4 2 2 1 3 3 3

পদক্ষেপ দ্বারা:

a <- ordered(x, levels = y) # Create ordered factor from "x" upon order in "y".
[1] 2 2 3 4 1 4 4 3 3
Levels: 4 < 2 < 1 < 3

b <- order(a) # Define "x" order that match to order in "y".
[1] 4 6 7 1 2 5 3 8 9

x[b] # Reorder "x" according to order in "y".
[1] 4 4 4 2 2 1 3 3 3

1

[ সম্পাদনা করুন: স্পষ্টতই আয়ানের সঠিক দৃষ্টিভঙ্গি রয়েছে তবে আমি এটি উত্তরসূরির জন্য রেখে দেব]]

আপনি আপনার y ভেক্টরের সাথে সূচি রেখে লুপগুলি ছাড়াই এটি করতে পারেন। Y তে একটি বর্ধিত সংখ্যাসূচক মান যুক্ত করুন এবং সেগুলি মার্জ করুন:

y <- data.frame(index=1:length(y), x=y)
x <- data.frame(x=x)
x <- merge(x,y)
x <- x[order(x$index),"x"]
x
[1] 4 4 4 2 2 1 3 3 3

0
x <- c(2, 2, 3, 4, 1, 4, 4, 3, 3)
y <- c(4, 2, 1, 3)
for(i in y) { z <- c(z, rep(i, sum(x==i))) }

Z এর ফলাফল: 4 4 4 2 2 1 1 3 3 3

গুরুত্বপূর্ণ পদক্ষেপগুলি:

  1. (i in y) - স্বার্থের উপাদানগুলির উপর চাপ দেয়।

  2. z <- c (z, ...) - প্রতিটি সুব্র্যাপশনকে ঘুরে দাঁড়ায়

  3. rep (i, যোগফল (x == i)) - i (বর্তমান আগ্রহের উপাদান) যোগফল (x == i) বার (আমরা x- এ আমরা যে বার পেয়েছি তার সংখ্যা) পুনরাবৃত্তি করে।


0

এছাড়াও আপনি নীচের পছন্দগুলিতে sqldfকোনও joinফাংশন দ্বারা এটি ব্যবহার এবং করতে পারেন sql:

library(sqldf)
x <- data.frame(x = c(2, 2, 3, 4, 1, 4, 4, 3, 3))
y <- data.frame(y = c(4, 2, 1, 3))

result <- sqldf("SELECT x.x FROM y JOIN x on y.y = x.x")
ordered_x <- result[[1]]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.