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


मेरे पास दो डेटा फ्रेम हैं जो मैं 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 फ़ंक्शंस केवल मुझे एक कॉलम नाम निर्दिष्ट करने देता है, लेकिन मुझे दो निर्दिष्ट करने की आवश्यकता है। मैं इस तरह कुछ ढूंढ रहा हूँ:

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 का उपयोग कर इस तरह के शामिल करने का तरीका क्या है?

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


58
2018-02-19 18:14


मूल


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


जवाब:


यह सुविधा dplyr v0.3 में जोड़ा गया है। अब आप नामित चरित्र वेक्टर पास कर सकते हैं by में तर्क left_join (और अन्य शामिल फ़ंक्शंस) यह निर्दिष्ट करने के लिए कि प्रत्येक डेटा फ्रेम में कौन से कॉलम शामिल हों। मूल प्रश्न में दिए गए उदाहरण के साथ, कोड होगा:

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

92
2017-10-17 19:44



संपादित करें यह सामान्य मामले में भी काम करता है: left_join(data_a, data_b, by = c("a.first" = "b.first", "a.second" = "b.second", "a.third" = "b.third")) ? - davidski
by = वैकल्पिक है। तुम कर सकते हो left_join(test_data, kantrowitz, c("first_name" = "name")) - Pranay Aryal
यह किसी फ़ंक्शन के लिए किसी भी तर्क के बारे में सच है। लेकिन मुझे आम तौर पर इस मामले में स्थिति की स्थिति के बजाय नामित तर्कों का उपयोग करके स्पष्ट होना बेहतर लगता है। - Lincoln Mullen


यह वास्तविक समाधान की तुलना में अधिक कामकाज है। आप एक नई वस्तु बना सकते हैं 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>

4
2018-02-19 18:22



नामकरण एक प्रतिलिपि उत्पन्न करता है, मुझे लगता है, जो कि रास्ता हो सकता है, जो इसे से बचाता है और इसके बजाय आपको ऐसा करता है। - joran
0.1.2 में आप कम से कम करने में सक्षम होंगे select(test_data, first_name = name) और यह केवल एक उथली प्रतिलिपि बना देगा। - hadley
उपयोग data.table::setnames? - Hugh
समाधान चयन (test_data, first_name = name) जून 2014 तक काम नहीं करता है - userJT