এক্সপ্লোরার যুক্ত হওয়ার সময় এক্স এবং ওয়াইয়ের জন্য কলামগুলির নাম কীভাবে নির্দিষ্ট করবেন?


91

আমার কাছে দুটি ডেটা ফ্রেম রয়েছে যা আমি dplyr ব্যবহার করে যোগ দিতে চাই। একটি হ'ল প্রথম নাম সম্বলিত একটি ডেটা ফ্রেম।

test_data <- data.frame(first_name = c("john", "bill", "madison", "abby", "zzz"),
                        stringsAsFactors = FALSE)

অন্যান্য ডেটা ফ্রেমে লিখিতকরণ সনাক্তকরণ, ক্যান্ট্রোয়েজ নাম কর্পাসের একটি পরিষ্কার সংস্করণ রয়েছে। এখানে একটি ন্যূনতম উদাহরণ:

kantrowitz <- structure(list(name = c("john", "bill", "madison", "abby", "thomas"), gender = c("M", "either", "M", "either", "M")), .Names = c("name", "gender"), row.names = c(NA, 5L), class = c("tbl_df", "tbl", "data.frame"))

আমি test_dataটেবিলটি ব্যবহার করে kantrowitzটেবিলটি থেকে মূলত নামের লিঙ্গটি সন্ধান করতে চাই । কারণ আমি একটি ফাংশন মধ্যে এই বিমূর্ত যাচ্ছি encode_gender, আমি ডেটা সেট ব্যবহার করা যাচ্ছে কলাম নাম জানেন না, এবং তাই আমি নিশ্চয়তা দিতে পারে না এটা হবে name, হিসাবে kantrowitz$name

বেসে আরআই এইভাবে মার্জটি সম্পাদন করবে:

merge(test_data, kantrowitz, by.x = "first_names", by.y = "name", all.x = TRUE)

এটি সঠিক ফলাফল দেয়:

  first_name gender
1       abby either
2       bill either
3       john      M
4    madison      M
5        zzz   <NA>

তবে আমি dplyr এ এটি করতে চাই কারণ আমি আমার অন্যান্য সমস্ত ডেটা ম্যানিপুলেশনের জন্য সেই প্যাকেজটি ব্যবহার করছি। byবিভিন্ন *_joinফাংশনের dplyr বিকল্পটি আমাকে কেবল একটি কলামের নাম নির্দিষ্ট করতে দেয়, তবে আমার দুটি উল্লেখ করতে হবে। আমি এই জাতীয় কিছু খুঁজছি:

library(dplyr)
# either
left_join(test_data, kantrowitz, by.x = "first_name", by.y = "name")
# or
left_join(test_data, kantrowitz, by = c("first_name", "name"))

Dplyr ব্যবহার করে এই জাতীয় যোগদানের উপায় কী?

(কখনই মনে করবেন না যে ক্যান্ট্রোয়েটজ কর্পাস লিঙ্গ সনাক্তকরণের একটি খারাপ উপায় I'm


4
আপনি বর্তমানে পারবেন না তবে এটি করা তালিকায় রয়েছে: github.com/hadley/dplyr/issues/177
hadley

উত্তর:


153

Dplyr v0.3 এ এই বৈশিষ্ট্যটি যুক্ত করা হয়েছে। আপনি প্রতিটি ডাটা ফ্রেমে কোন কলামগুলিতে যোগদান করতে হবে তা নির্দিষ্ট করতে এখন (এবং অন্যান্য যোগদানের ফাংশনগুলি) byযুক্তিতে নামযুক্ত চরিত্রের ভেক্টরটি পাস করতে পারেন left_join। মূল প্রশ্নে দেওয়া উদাহরণ সহ কোডটি হ'ল:

left_join(test_data, kantrowitz, by = c("first_name" = "name"))

13
সম্পাদনা পাশাপাশি সাধারণ ক্ষেত্রে এই কাজগুলো করেনঃ left_join(data_a, data_b, by = c("a.first" = "b.first", "a.second" = "b.second", "a.third" = "b.third"))?
ডেভিডস্কি

by =ঐচ্ছিক। আপনি করতে পারেনleft_join(test_data, kantrowitz, c("first_name" = "name"))
প্রণয় আরিয়াল

11
এটি একটি ফাংশন সম্পর্কিত যে কোনও যুক্তির সত্য। তবে আমি সাধারণত এই ক্ষেত্রে পজিশনের তুলনায় নাম যুক্তি ব্যবহার করে সুস্পষ্ট হওয়া ভাল বলে মনে করি।
লিংকন মুলেন

5

এটি প্রকৃত সমাধানের চেয়ে অনেক বেশি কাজ। আপনি test_dataঅন্য কলামের নাম সহ একটি নতুন অবজেক্ট তৈরি করতে পারেন :

left_join("names<-"(test_data, "name"), kantrowitz, by = "name")

     name gender
1    john      M
2    bill either
3 madison      M
4    abby either
5     zzz   <NA>

পুনঃনামকরণ একটি অনুলিপি প্ররোচিত করে, আমি মনে করি, ডাইপ্লায়ার এড়াতে পারে এবং পরিবর্তে আপনাকে এটি করতে বাধ্য করে।
joran

4
0.1.2 এ আপনি কমপক্ষে করতে সক্ষম হবেন select(test_data, first_name = name)এবং এটি কেবল অগভীর অনুলিপি তৈরি করবে।
হ্যাডলি

4
ব্যবহার করবেন data.table::setnames?
হিউজ

4
সমাধান নির্বাচন (টেস্ট_ডেটা, প্রথম নাম = নাম) জুন ২০১৪ পর্যন্ত কাজ করে না
ব্যবহারকারী জেটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.