2013-03-22 13 views
6

एक आबादी वाले data.table और एक अन्य एक के बाद एक एनए पंक्ति data.table जिसके परिणामस्वरूप में है कि खाली प्रस्तुत किया जो मर्ज कर:merge.data.table सभी के साथ = सही परिचय एनए पंक्ति। क्या ये सही है?

a = data.table(c=c(1,2),key='c') 
b = data.table(c=3,key='c') 
b=b[c!=3] 
b 
# Empty data.table (0 rows) of 1 col: c 
merge(a,b,all=T) 
#  c 
# 1: NA 
# 2: 1 
# 3: 2 

क्यों? मैं उम्मीद है कि यह data.table a का केवल पंक्तियों को वापस होगा, क्योंकि यह merge.data.frame के साथ करता है:

> merge.data.frame(a,b,all=T,by='c') 
# c 
#1 1 
#2 2 
+0

तो आप एक खाली डेटा तालिका 'बी' के साथ' a' मर्ज करना चाहते हैं। आप असामान्य तरीके से 'बी' क्यों पेश करते हैं? 'B = data.table()' का उपयोग क्यों न करें? – user974514

+0

@ user974514: मैं सिर्फ समस्या को पुन: पेश करना चाहता था क्योंकि यह मेरे कोड में दिखाई दिया था। आम तौर पर मेरे कोड में 'data.table' पॉप्युलेट होता है, लेकिन कभी-कभी नहीं, और मेरे मामले में तालिकाओं की कुंजी होती है और मर्ज स्वाभाविक रूप से इन चाबियों का उपयोग करती है। एक साधारण 'data.table()' वास्तव में मेरी समस्या का पुन: उत्पन्न नहीं करता है। – vsalmendra

+0

@ user974514, जो एक पूर्ण डेटा.table (0 पंक्तियों और स्तंभ) देगा और कोई "कुंजी" कॉलम नहीं होगा। तो, विलय संभव नहीं होगा। – Arun

उत्तर

5

प्रश्न में उदाहरण समस्या को दिखाने के लिए अभी तक बहुत आसान है, इसलिए भ्रम और चर्चा । दो एक-कॉलम data.table एस का उपयोग करके यह दिखाने के लिए पर्याप्त नहीं है कि merge क्या करता है!

> a = data.table(P=1:2,Q=3:4,key='P') 
> b = data.table(P=2:3,R=5:6,key='P') 
> a 
    P Q 
1: 1 3 
2: 2 4 
> b 
    P R 
1: 2 5 
2: 3 6 
> merge(a,b) # correct 
    P Q R 
1: 2 4 5 
> merge(a,b,all=TRUE) # correct. 
    P Q R 
1: 1 3 NA 
2: 2 4 5 
3: 3 NA 6 
> merge(a,b[0],all=TRUE) # incorrect result when y is empty, agreed 
    P Q R 
1: NA NA NA 
2: NA NA NA 
3: 1 3 NA 
4: 2 4 NA 
> merge.data.frame(a,b[0],all=TRUE) # correct 
    P Q R 
1 1 3 NA 
2 2 4 NA 

रिकार्डो इस की तह तक गया और v1.8.9 में यह तय:

यहाँ एक बेहतर उदाहरण है। समाचार से:

मर्ज नहीं रह गया है नकली एनए पंक्ति (यों) लौटाता है जब y खाली है और all.y = सही (या सभी = TRUE), #2633। रिपोर्टिंग के लिए धन्यवाद विनीसियस Almendra के लिए। टेस्ट जोड़ा गया।

0

को देखते हुए आप अपने रास्ते में a और b परिभाषित करते हैं। rbind(a,b) का सरल उपयोग केवल a की पंक्तियों को वापस करेगा।

हालांकि यदि आप कुछ अन्य गैर-खाली डेटा तालिका a के साथ NULL डेटा तालिका b मर्ज करना चाहते हैं, तो अलग-अलग दृष्टिकोण है। मुझे एक ही समस्या थी जब मुझे विभिन्न लूपों के भीतर अलग-अलग डेटा टेबल मर्ज करना पड़ा। मैंने इस कामकाज का इस्तेमाल किया।

#some loop that returns data.table named a 
    #another loop starts 
    if(all.equal(a,b<-data.table())==TRUE){ 
    b<-a 
    next 
    } 
    merge(a,b,c("Factor1","Factor2")) 

इससे मेरी मदद की, शायद यह आपकी भी मदद करेगा।

+0

क्षमा करें, मुझे आपका if-statement नहीं मिलता है। यदि 'ए' '0 से 0' (जैसे' बी') आयामों का' data.table' है, तो आप 'b' को' a' असाइन करते हैं। क्यूं कर? और आप 'प्रतिलिपि (ए)' का उपयोग नहीं कर रहे हैं। यह केवल संदर्भ द्वारा असाइन करेगा और बी को कॉपी नहीं करेगा। मुझे यह नहीं मिला। – Arun

+0

मान लें कि आपके पास एक लूप है जहां आप डेटा.table 'a' भरते हैं। तो यह खाली नहीं है। लेकिन लूप के अंत में आप इसे अन्य डेटा तालिका 'बी' के साथ मर्ज करना चाहते हैं जो पहले पुनरावृत्ति में खाली हो सकता है, लेकिन दूसरे में खाली नहीं हो जाता है। यही कामकाज हल करता है। – user974514

+0

नीचे वोट मुझसे है, अगर आप समझा सकते हैं (या संपादित कर सकते हैं), मुझे अप-वोट करने में खुशी होगी)। – Arun

1

सभी: तार्किक; सभी = TRUE दोनों को .x = TRUE और all.y = TRUE दोनों को सहेजने के लिए शॉर्टेंड है।

all.x: तार्किक; यदि सही है, तो अतिरिक्त पंक्तियों को आउटपुट में जोड़ा जाएगा, प्रत्येक पंक्ति के लिए x में जो कि y में कोई मिलान पंक्ति नहीं है। ये पंक्तियां में उन कॉलमों में एनए होगा जो आमतौर पर वाई से मूल्यों के साथ जुड़ जाते हैं। डिफ़ॉल्ट गलत है, ताकि केवल पंक्तियों को एक्स और वाई दोनों के डेटा के साथ आउटपुट में शामिल किया गया हो।

all.y: तार्किक; उपरोक्त all.x के समान।

यह data.table documentation से लिया जाता है। अधिक के लिए, वहां merge फ़ंक्शन के लिए तर्कों का विवरण देखें।

मुझे लगता है कि यह आपके प्रश्न का उत्तर देता है।

+0

शायद आप 'ifelse (dim (b) [1] == 0, विलय (ए, बी, all.x = टी), मर्ज (ए, बी, all.y = टी)) का प्रयास कर सकते हैं, या कुछ समान –

+1

यह दस्तावेज 'merge.data.frame' जैसा ही है, जो अलग-अलग व्यवहार करता है। मुझे समझ में नहीं आता कि खाली तालिका के साथ एक पूर्ण बाहरी जुड़ने के लिए एनए पंक्ति क्यों जोड़नी चाहिए। – vsalmendra

0

merge.data.frameall=T के लिए के रूप में, उम्मीद की जा करने के लिए यह एक full outer join है, तो आप प्राप्त दोनों तालिकाओं के सभी कुंजियां देखने about merge

+0

तालिका 'बी' में एक खाली कुंजी (कोई पंक्तियां नहीं है), जो मूल्य NA के साथ एक कुंजी से अलग है। – vsalmendra

+2

आपको एक बग मिल सकती है, क्योंकि यह एक बहुत ही असामान्य मामला है, क्या आप डेटा-टेबल सूची पर पोस्ट कर सकते हैं? – statquant

+0

धन्यवाद। मैंने अभी इसे सबमिट किया है और मुझे मिली एक और बग, खाली डेटा.table से भी संबंधित है ... – vsalmendra

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