Dplyr में शामिल होने पर x और y के कॉलम के नाम कैसे निर्दिष्ट करें?


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

बेस में RI इस तरह मर्ज करेगा:

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>

लेकिन मैं यह पूरी तरह से करना चाहता हूं क्योंकि मैं अपने सभी अन्य डेटा हेरफेर के लिए उस पैकेज का उपयोग कर रहा हूं। 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"))

इस तरह के प्रदर्शन में शामिल होने का तरीका क्या है?

(कभी भी इस बात का ध्यान न रखें कि कंटरोवित्ज़ कॉर्पस लिंग की पहचान करने का एक बुरा तरीका है। मैं बेहतर कार्यान्वयन पर काम कर रहा हूं, लेकिन मैं यह काम पहले करना चाहता हूं।)


3
आप वर्तमान में नहीं कर सकते हैं, लेकिन यह करने के लिए सूची में है: github.com/hadley/dplyr/issues/177
हैडली

जवाबों:


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>

नाम बदलने से एक प्रतिलिपि बनती है, मुझे लगता है, जो इस तरह से हो सकता है कि इसे टाल देता है और आपको इसके बजाय ऐसा करता है।
जोरन

2
0.1.2 में आप कम से कम ऐसा करने में सक्षम होंगे select(test_data, first_name = name)और वह केवल एक उथली प्रतिलिपि बना देगा।
हैडली

1
का उपयोग करें data.table::setnames?
ह्यूग

2
समाधान का चयन करें (test_data, first_name = नाम) जून 2014 तक काम नहीं करता है
userJT
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.