2013-07-10 3 views
9

निम्न उदाहरणकैसे पुन: क्रम स्तंभों से मर्ज को रोकने के लिए

x <- data.frame(code = 7:9, food = c('banana', 'apple', 'popcorn')) 
y <- data.frame(food = c('banana', 'apple', 'popcorn'), 
       isfruit = c('fruit', 'fruit', 'not fruit')) 

में मैं x <- merge(x, y) करना चाहते हैं, लेकिन समस्या यह है कि merge() पुन: क्रमित कॉलम ताकि by स्तंभ (खाद्य) पहले आता है। मैं इसे कैसे रोक सकता हूं और merge(x, y) एक्स के समान कॉलम ऑर्डर का उपयोग कर सकता हूं और केवल "चर, कोड, आइसफ्रूट" के बजाय तीसरा कॉलम (यानी, "कोड, भोजन, आइसफ्रूट") के रूप में नया चर (isFruit) डालें)?

मैं इस की कोशिश की है, कोई लाभ नहीं हुआ:

merge(x, y, sort = F) 

मेरे वैकल्पिक हल इस बाद में

x <- x[c(2, 1, 3)] 
+3

मुझे लगता है कि आपका काम समाधान है। – joran

+4

... हालांकि ऐसा लगता है कि plyr पैकेज में 'join' कॉलम को पुन: व्यवस्थित नहीं करता है। – joran

उत्तर

17

यहाँ अपने आधार वैकल्पिक हल के जेनेरिक वर्जन है:

merge(x, y)[, union(names(x), names(y))] 
6

आप इसे अपने कस्टम समारोह में लपेट कर सकते हैं करना है।

merge.keep <- function(...,ord=union(names(x), names(y)))merge(...)[ord] 
तो उदाहरण के लिए

: उदाहरण के लिए:

merge.keep(x,y) 
    code food isfruit 
1 8 apple  fruit 
2 7 banana  fruit 
3 9 popcorn not fruit 

संपादित मैं @Eddi विचार का उपयोग ord के मूलभूत मूल्यों स्थापित करने के लिए।

+2

-1 क्योंकि यह ओपी में कुछ भी नहीं जोड़ता है - ओपी क्या चाहता है ** ** ** मैन्युअल रूप से ऑर्डर निर्दिष्ट करने के लिए नहीं है – eddi

+1

@ डेडी अच्छी पकड़ भी मैं डाउनवोट से असहमत हूं (मुझे थोड़ा सा तेज लगता है)। मेरा विचार एक ऐसा फ़ंक्शन बनाना था जो मर्ज फ़ंक्शन का विस्तार करे। मैं आदेश के डिफ़ॉल्ट मान सेट करने के लिए अपने अच्छे विचार का उपयोग करके अपना जवाब संपादित करता हूं। – agstudy

+0

+1 अब यह ओपी का जवाब देता है :) – eddi

11

plyr इस आसान बनाता है:

x <- data.frame(code = 7:9, food = c('banana', 'apple', 'popcorn')) 
y <- data.frame(food = c('banana', 'apple', 'popcorn'), 
       isfruit = c('fruit', 'fruit', 'not fruit')) 

library(plyr) 
join(x,y) 

     #GOOD 
#Joining by: food 
# code food isfruit 
#1 7 banana  fruit 
#2 8 apple  fruit 
#3 9 popcorn not fruit 

    #BAD 
# merge(x,y) 
#  food code isfruit 
#1 apple 8  fruit 
#2 banana 7  fruit 
#3 popcorn 9 not fruit 
+1

'plyr' ने एक बार में मेरी समस्याओं का एक गुच्छा हल किया। पारितोषिक के लिए धन्यवाद! – dsb

0

आप केवल एक कॉलम में लाने के लिए और तो शायद merge overkill है संलग्न करने के लिए यह पिछले चाहते हैं और आप केवल match - [ इंडेक्सिंग दृष्टिकोण के साथ एक आकलन कर सकते हैं:

> x$isfruit <- y$isfruit[match(y$food, x$food)] 
> x 
    code food isfruit 
1 7 banana  fruit 
2 8 apple  fruit 
3 9 popcorn not fruit 

(जो भी आप पूछते हैं उसे करने के लिए मर्ज फ़ंक्शन में फेंकने के लिए कोई स्विच नहीं हैं।)

+0

इनपुट के लिए धन्यवाद, लेकिन मेरे वास्तविक डेटा में दर्जनों स्तंभों के साथ दो डेटा फ्रेम शामिल हैं। –

संबंधित मुद्दे