নির্দিষ্ট অর্ডার সহ ভেক্টর অনুযায়ী ডেটা ফ্রেম সারি অর্ডার করুন


158

নীচের সংক্ষিপ্ত উদাহরণে আমি যেটি প্রয়োগ করেছি তার হিসাবে কোনও "ফ্রেম" ভেক্টর অনুযায়ী ডেটা ফ্রেমের সারি অর্ডার করা হয়েছে তা নিশ্চিত করার সহজ উপায় কি আছে?

df <- data.frame(name = letters[1:4], value = c(rep(TRUE, 2), rep(FALSE, 2)))

df
#   name value
# 1    a  TRUE
# 2    b  TRUE
# 3    c FALSE
# 4    d FALSE

target <- c("b", "c", "a", "d")

কাজটি পেতে এটি কোনওরকম কিছুটা "জটিল" বলে মনে হচ্ছে:

idx <- sapply(target, function(x) {
    which(df$name == x)
})
df <- df[idx,]
rownames(df) <- NULL

df 
#   name value
# 1    b  TRUE
# 2    c FALSE
# 3    a  TRUE
# 4    d FALSE

উত্তর:


232

চেষ্টা করুন match:

df <- data.frame(name=letters[1:4], value=c(rep(TRUE, 2), rep(FALSE, 2)))
target <- c("b", "c", "a", "d")
df[match(target, df$name),]

  name value
2    b  TRUE
3    c FALSE
1    a  TRUE
4    d FALSE

এটি ততক্ষণ কাজ করবে যতক্ষণ না আপনার targetহুবহু একই উপাদান রয়েছে df$nameএবং এর মধ্যে সদৃশ মানও থাকবে না।

থেকে ?match:

match returns a vector of the positions of (first) matches of its first argument 
in its second.

সুতরাং matchসারি সংখ্যাগুলি খুঁজে বের করে যা targetউপাদানগুলির সাথে মেলে এবং তারপরে আমরা dfসেই ক্রমে ফিরে আসি।


দুর্দান্ত, এটি আরও পছন্দ এবং ঠিক আমি যা খুঁজছিলাম! অনেক অনেক ধন্যবাদ
রাপস্টার

1
একটি প্রশ্ন, আমি যে কলামটির সাথে মেলে দেখতে চাই তার পুনরাবৃত্ত মান আছে? মত b,c,a,d,b,c,a,d। আমি চেষ্টা করেছি matchকিন্তু এটি ভাল কাজ করে না।
ইউলং

@ ইউলং: আমার মনে হয় গুলি ছোঁড়ার আগে ডুপ্লিকেট অপসারণ করা হয়েছে তা আপনার স্পষ্ট করে নিশ্চিত করতে হবে match()। যা মনে আসে তা হ'ল duplicated(), unique()বা অন্য কোনও কাস্টম রুটিন যা অন্যকে ফেলে দেওয়ার সময় পছন্দসই উপাদানগুলিকে "রাখে"। আছে HTH
Rappster

@ অ্যাডওয়ার্ড এটি একটি দুর্দান্ত সমাধান। তবে এটি সূচকেও পরিবর্তন করে। আমি কীভাবে এগুলি আরোহী ক্রমে রাখতে পারি (1, 2, 3, 4)?
হাসান ইকবাল

2
নিশ্চিত না যে এটি সবচেয়ে পরিষ্কার উপায়, তবে কেবল "বেস" ফাংশনগুলির সাথে, আপনার যদি df তে নকল থাকে: এটি কাজ করা উচিত:df <- data.frame(name=letters[c(1:4, 1:4)], value=c(rep(TRUE, 2), rep(FALSE, 2),rep(TRUE, 2), rep(FALSE, 2) )) target <- c("b", "c", "a", "d") df[order(unlist(sapply(df$name, function(x) which(target == x)))),]
এরিকা ফারি

21

আমি ব্যবহার করতে পছন্দ ***_join মধ্যে dplyrযখনই আমি ডেটা মেলানো প্রয়োজন। এর জন্য একটি সম্ভাব্য চেষ্টা

left_join(data.frame(name=target),df,by="name")

নোট করুন যে ***_joinইনপুটটির জন্য tbls বা ডেটা ফ্রেম প্রয়োজন require


হ্যাঁ, এর মধ্যে _ _ যোগদানের কার্যগুলি dplyrখুব সুন্দর। এখনই এগুলি ব্যবহার করে শেষ করুন
র‌্যাপস্টার

এক্ষেত্রে ডেটা.ফ্রেম () ফ্যাক্টরগুলিতে রূপান্তর এড়াতে লক্ষ্য অর্ডারকে একটি টিবল হিসাবে ঘোষণা করার পরামর্শ দিন। target <- tibble(name = c("b", "c", "a", "d"))
নেটলেট

2
এবং পাইপ সিনট্যাক্স সহ:df %>% right_join(tibble(name = target), by = "name")
ফ্রাঙ্ক

18

এই পদ্ধতিটি কিছুটা আলাদা, এটি আমাকে পূর্বের উত্তরের চেয়ে কিছুটা নমনীয়তা সরবরাহ করেছিল। এটি একটি অর্ডারযুক্ত ফ্যাক্টর হিসাবে তৈরি করে, আপনি এটিকে আরও ভালভাবে ব্যবহার করতে পারেন arrange। আমি gdataপ্যাকেজ থেকে reorder.factor ব্যবহার করেছি ।

df <- data.frame(name=letters[1:4], value=c(rep(TRUE, 2), rep(FALSE, 2)))
target <- c("b", "c", "a", "d")

require(gdata)
df$name <- reorder.factor(df$name, new.order=target)

এরপরে, এটি এখন অর্ডার করা হয়েছে এমন সত্যটি ব্যবহার করুন:

require(dplyr)
df %>%
  arrange(name)
    name value
1    b  TRUE
2    c FALSE
3    a  TRUE
4    d FALSE

আপনি যদি মূল (বর্ণানুক্রমিক) ক্রমটিতে ফিরে যেতে চান তবে কেবল as.character()এটি আসল অবস্থায় ফিরে পেতে ব্যবহার করুন ।


2
কেউ কি এর একটি ডেটা.ট্যাবিল সংস্করণ জানেন?
রিলস্টাইন

2
@Reilstein setDT(df)[ , name := factor(name, levels = target)]। তারপরে এখানে দুটি data.tableউত্তর দেখুন
হেনরিক

4

আমরা এর উপর ভিত্তি করে ফ্যাক্টর স্তরগুলি সামঞ্জস্য করতে পারি targetএবং এটিতে ব্যবহার করতে পারিarrange

library(dplyr)
df %>% arrange(factor(name, levels = target))

#  name value
#1    b  TRUE
#2    c FALSE
#3    a  TRUE
#4    d FALSE

অথবা orderএটি এবং এটি ব্যবহার করুনslice

df %>% slice(order(factor(name, levels = target)))

2
সেরা সমাধান আইএমও
স্টিভেক

1
আমার জন্য সেরা এবং সহজ সমাধান।
ম্যাট_বি

0

যদি আপনি কোন লাইব্রেরি ব্যবহার করতে না চান এবং আপনি আপনার তথ্য reoccurrences থাকে, তাহলে আপনি ব্যবহার করতে পারেন whichসঙ্গে sapplyহিসাবে ভাল।

new_order <- sapply(target, function(x,df){which(df$name == x)}, df=df)
df        <- df[new_order,]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.