2016-10-18 3 views
5

両側の結合列にNAがある場合は、2つのデータフレームを結合します(つまり、両方ともcode列) dplyrを使用してdplyr :: left_join(R lang)対SQLを使用した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]) 

、我々が得る:SQLを使用して

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がSQL NULL値のようにNA Sを扱うことはありません参加しているようです。

  1. dplyrにはSQLと同じように動作する方法はありますか?
  2. このタイプのNA治療の背景にはどのような理由がありますか?

PS。もちろん、私は最初にそこに行くためにNAsを取り除くことができましたleft_join(a, na.omit(b), by="code")、それは私の質問ではありません。したがって、得られた「ヌル」S - SQLは、それが参加するべきかについての情報を持っていないため、デフォルトの列コードによって

答えて

0

は、したがって、SQLで

3

をNULL値を受け入れない、主キーを持っているが、「ヌル」、何にもマッチしていません結合されたデータセット内で、正しいデータセットに一致するものがない左外部結合を実行する場合と同じように表示されます。

しかし、ジョインになると「NA」のデフォルトの動作はほとんどデータポイント(null演算子など)のように扱われるため、「NA」は「NA」と一致します。たとえば、あなたはこれを回避することができます

> 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」パラメータを使用すると、基本的に一致させることができない値を定義し、することができますSQLが "null"を扱うようにRに "NA"を処理させます。それは、不可能な機能がleft_joinに実装されているようには見えませんが、単に別の名前を付けてもかまいません。

関連する問題