2016-10-18 7 views
5

मैं दो डेटाफ्रेम में शामिल होना चाहता हूं, जहां NA एस दोनों तरफ शामिल कॉलम में हो सकता है (यानी code कॉलम)dplyr का उपयोग करके NA/NULL उपचार में अंतर :: left_join (आर लैंग) बनाम एसक्यूएल बाएं जॉइन

a <- data.frame(code=c(1,2,NA)) 
b <- data.frame(code=c(1,2,NA, NA), name=LETTERS[1:4]) 

dplyr का उपयोग करना, हम पाते हैं:

left_join(a, b, by="code") 

    code name 
1 1 A 
2 2 B 
3 NA C 
4 NA D 

एसक्यूएल का उपयोग करना, हम पाते हैं:

CREATE TABLE a (code INT); 
INSERT INTO a VALUES (1),(2),(NULL); 
CREATE TABLE b (code INT, name VARCHAR); 
INSERT INTO b VALUES (1, 'A'),(2, 'B'),(NULL, 'C'), (NULL, 'D'); 
SELECT * FROM a LEFT JOIN b USING (code); 

enter image description here

ऐसा लगता है कि dplyr मिलती एसक्यूएल NULL मूल्यों की तरह NA रों का इलाज नहीं है।

  1. वहाँ एक रास्ता dplyr एसक्यूएल रूप में एक ही तरह से व्यवहार करने के लिए है?
  2. इस प्रकार के एनए उपचार के पीछे तर्क क्या है?

पीएस। बेशक, मैं वहां left_join(a, na.omit(b), by="code") प्राप्त करने के लिए पहले एनएएस को हटा सकता था, लेकिन यह मेरा सवाल नहीं है।

उत्तर

0

डिफ़ॉल्ट स्तंभ कोड से प्राथमिक कुंजी है, इसलिए शून्य मूल्य स्वीकार नहीं

3

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

हालांकि आर में, "एनए" के लिए डिफ़ॉल्ट व्यवहार में शामिल होने के लिए डिफ़ॉल्ट व्यवहार लगभग डेटा बिंदु (उदा। एक नल ऑपरेटर) की तरह व्यवहार करना है, इसलिए "एनए" "एनए" से मेल खाता है। उदाहरण के लिए,

> match(NA, NA) 
[1] 1 

एक तरह से आप इस दरकिनार कर सकते हैं आधार मर्ज विधि का उपयोग किया जाएगा,

> merge(a, b, by="code", all.x=TRUE, incomparables=NA) 
    code name 
1 1 A 
2 2 B 
3 NA <NA> 

"incomparables" पैरामीटर यहाँ आप मानों मिलान नहीं किया जा सकता है परिभाषित करने के लिए, और अनिवार्य रूप की अनुमति देता है एसक्यूएल "एनएएल" के तरीके के साथ "एनए" का इलाज करने के लिए आर को मजबूर करता है। ऐसा लगता है कि incomparables सुविधा left_join में लागू की गई है, लेकिन इसे आसानी से अलग किया जा सकता है।

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