2014-09-16 7 views
9

निश्चित रूप से इसका इरादा नहीं है? क्या यह ऐसा कुछ है जो dplyr की कार्यक्षमता के अन्य हिस्सों में होता है और क्या मुझे चिंतित होना चाहिए? मुझे प्रदर्शन पसंद है और data.table वाक्यविन्यास से नफरत है। क्या dplyr और data.table का कोई विकल्प है जो वर्तमान में उपयोग करने के लिए सुरक्षित है और अभी भी उच्च प्रदर्शन है?dplyr के left_join के साथ गलत व्यवहार?

A <- structure(list(ORDER = c(30305720L, 30334659L, 30379936L, 
        30406397L, 30407697L, 30431950L), 
        COST = c("0", "", "11430.52", "20196.279999999999", "0", "10445.99")), 
       .Names = c("ORDER", "COST"), 
       row.names = c(NA, 6L), 
       class = "data.frame") 

B <- structure(list(ORDER = c(30334659, 30379936, 30406397, 30407697, 30431950), 
        AREA = c(0, 2339, 2162, 23040, 475466)), 
       .Names = c("ORDER", "AREA"), 
       row.names = c(4L, 8L, 11L, 12L, 15L), 
       class = c("tbl_df", "tbl", "data.frame")) 

कचरा परिणाम:

left_join(A, B) 
    ORDER COST     AREA 
1 30305720     0 NA 
2 30334659      NA 
3 30379936   11430.52 NA 
4 30406397 20196.279999999999 NA 
5 30407697     0 NA 
6 30431950   10445.99 NA 

प्रभावी परिणाम:

merge(A, B, all.x=T, all.y=F) 
    ORDER    COST AREA 
1 30305720     0  NA 
2 30334659       0 
3 30379936   11430.52 2339 
4 30406397 20196.279999999999 2162 
5 30407697     0 23040 
6 30431950   10445.99 475466 
+0

मैं आर संस्करण 3.1 का उपयोग कर रहा हूं। – stanekam

+0

नोट यह प्रतीत होता है कि यह https://github.com/hadley/dplyr/issues/601 – mnel

+1

ध्यान दें कि 'data.table' वाक्यविन्यास 'setDT (ए); setDT (बी); setkey (ए, ORDER) ; सेटकी (बी, ऑर्डर); ए [बी] '"प्रभावी परिणाम" प्रदान करने के लिए काम करता है। 'data.table' मशीन सहिष्णुता के बराबर कुंजी/समूह बनाता है। – mnel

उत्तर

10

मैं दूसरे दिन कुछ इसी तरह पोस्ट। मुझे लगता है कि आपको क्या करने की ज़रूरत है, यह संख्यात्मक (या संभवतः दूसरी तरफ) के रूप में ऑर्डर करना है। ए ऑर्डर में पूर्णांक है। लेकिन बी ने संख्यात्मक के रूप में आदेश दिया है। फिलहाल, dplyr आपको एक ही कक्षा में समूह-चर के रूप में पूछने के लिए कहता है। मुझे एक एसओ उपयोगकर्ता से एक टिप्पणी मिली कि यह हैडली और उनकी टीम अब कुछ काम कर रही है। भविष्य में यह मुद्दा तय किया जाएगा।

A$ORDER <- as.numeric(A$ORDER) 
left_join(A,B, by = "ORDER") 

    ORDER    COST AREA 
1 30305720     0  NA 
2 30334659       0 
3 30379936   11430.52 2339 
4 30406397 20196.279999999999 2162 
5 30407697     0 23040 
6 30431950   10445.99 475466 

अद्यतन thelatemail के साथ टिप्पणी का आदान प्रदान के बाद, मैं यहाँ और अधिक टिप्पणियों जोड़ने का निर्णय लिया।

मामला 1: इलाज सांख्यिक

A$ORDER <- as.numeric(A$ORDER) 

> left_join(A,B, by = "ORDER") 
    ORDER    COST AREA 
1 30305720     0  NA 
2 30334659       0 
3 30379936   11430.52 2339 
4 30406397 20196.279999999999 2162 
5 30407697     0 23040 
6 30431950   10445.99 475466 

> left_join(B,A, by = "ORDER") 
Source: local data frame [5 x 3] 

    ORDER AREA    COST 
1 30334659  0     
2 30379936 2339   11430.52 
3 30406397 2162 20196.279999999999 
4 30407697 23040     0 
5 30431950 475466   10445.99 

के रूप में आदेश तुम दोनों ए और बी में पूर्णांक, वह भी काम करता है के रूप में आदेश है।

केस 2: पूर्णांक के रूप में आदेश उपचार और संख्यात्मक

> left_join(A,B, by = "ORDER") 
    ORDER    COST AREA 
1 30305720     0 NA 
2 30334659      NA 
3 30379936   11430.52 NA 
4 30406397 20196.279999999999 NA 
5 30407697     0 NA 
6 30431950   10445.99 NA 

> left_join(B,A, by = "ORDER") 
Source: local data frame [5 x 3] 

    ORDER AREA    COST 
1 30334659  0     
2 30379936 2339   11430.52 
3 30406397 2162 20196.279999999999 
4 30407697 23040     0 
5 30431950 475466   10445.99 

thelatemail ने सुझाव दिया है, पूर्णांक/सांख्यिक संयोजन काम नहीं करता। लेकिन संख्यात्मक/पूर्णांक संयोजन काम करता है।

इन अवलोकनों को देखते हुए, इस समय समूह-चर चरम में संगत होना सुरक्षित है। वैकल्पिक रूप से, merge() जाने का रास्ता है। यह पूर्णांक और संख्यात्मक संभाल सकता है।

> merge(A,B, by = "ORDER", all = TRUE) 
    ORDER    COST AREA 
1 30305720     0  NA 
2 30334659       0 
3 30379936   11430.52 2339 
4 30406397 20196.279999999999 2162 
5 30407697     0 23040 
6 30431950   10445.99 475466 

> merge(B,A, by = "ORDER", all = TRUE) 
    ORDER AREA    COST 
1 30305720  NA     0 
2 30334659  0     
3 30379936 2339   11430.52 
4 30406397 2162 20196.279999999999 
5 30407697 23040     0 
6 30431950 475466   10445.99 

UPDATE2

मैं dplyr (dplyr_0.3.0.9000) के एक देव संस्करण का उपयोग कर रहा है, जो आपको Github से डाउनलोड कर सकते हैं (नवंबर की 8 वीं, 2014 को)। उपरोक्त मुद्दा अब हल हो गया है।

left_join(A,B, by = "ORDER") 
#  ORDER    COST AREA 
#1 30305720     0  NA 
#2 30334659       0 
#3 30379936   11430.52 2339 
#4 30406397 20196.279999999999 2162 
#5 30407697     0 23040 
#6 30431950   10445.99 475466 
+1

+1 - पंच को पीटा गया। मैं अभी भी परेशान हूं कि क्यों 'left_join (बी, ए)' ठीक काम करता है। – thelatemail

+0

@thelatemail यह एक दिलचस्प अवलोकन है। यदि ऐसा है, तो यह एक असली बग है? – jazzurro

+0

एक त्वरित नज़र में, मैं कहूंगा कि यह है। यह असफल होने के लिए एक पूर्णांक/संख्यात्मक जुड़ने के लिए मेरे अनुरूप नहीं होगा लेकिन सफल होने के लिए एक संख्यात्मक/पूर्णांक शामिल होगा। – thelatemail

-1

dplyr प्रलेखन से:

left_join() एक्स से सभी पंक्तियों, और x और y से सभी स्तंभों को देता है। एक्स में किसी भी मैच के साथ एक्स में पंक्तियों में नए कॉलम में एनए मान होंगे। यदि एक्स और वाई के बीच कई मैचों हैं, तो मैचों के सभी संयोजन लौटाए जाते हैं।

semi_join() x से सभी पंक्तियां लौटाता है जहां y में मिलान मान होते हैं, केवल x से कॉलम रखते हैं। एक अर्द्ध शामिल एक आंतरिक शामिल होने से अलग होता है क्योंकि एक आंतरिक जुड़ाव वाई की प्रत्येक मिलान पंक्ति के लिए x की एक पंक्ति वापस कर देगा, जहां अर्द्ध जुड़ाव x की पंक्तियों को डुप्लिकेट नहीं करेगा।

यह अर्द्ध_जॉइन() आपके लिए एक मूल्यवान विकल्प है?

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