2016-10-18 29 views
5

Tôi muốn tham gia hai dataframes, trong đó có thể có NA s trong cột kết nối ở cả hai bên (tức là cả hai cột code)Sự khác biệt trong điều trị NA/NULL bằng cách sử dụng dplyr :: left_join (R lang) so với SQL LEFT JOIN

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

Sử dụng dplyr, chúng tôi nhận được:

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

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

Sử dụng SQL, chúng tôi nhận được:

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

Dường như dplyr tham gia không xử lý các giá trị NA giống như giá trị SQL NULL.

  1. Có cách nào để có được dplyr hoạt động giống như SQL không?
  2. Lý do đằng sau loại điều trị NA này là gì?

PS. Tất nhiên, tôi có thể loại bỏ NA trước tiên để đạt được điều đó left_join(a, na.omit(b), by="code"), nhưng đó không phải là câu hỏi của tôi.

Trả lời

0

theo mã cột mặc định có khóa chính, do đó không chấp nhận giá trị NULL

3

Trong SQL, "null" phù hợp gì cả, bởi vì SQL không có thông tin về những gì nó nên tham gia vào - vì thế kết quả là "vô giá trị" s trong tập dữ liệu đã tham gia của bạn, giống như nó sẽ xuất hiện nếu thực hiện các kết nối bên ngoài bên trái mà không khớp trong tập dữ liệu bên phải. Tuy nhiên, mặc dù, hành vi mặc định cho "NA" khi nói đến tham gia gần như coi nó như một điểm dữ liệu (ví dụ: toán tử null), vì vậy "NA" sẽ khớp với "NA". Ví dụ,

> match(NA, NA) 
[1] 1 

Một cách để bạn có thể phá vỡ này sẽ được sử dụng các phương pháp cơ sở hợp nhất,

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

Các "incomparables" tham số ở đây cho phép bạn xác định các giá trị mà không thể được xuất hiện, và về cơ bản buộc R điều trị "NA" theo cách SQL xử lý "null". Nó không giống như tính năng không thể so sánh được thực hiện trong left_join, nhưng nó có thể chỉ đơn giản là được đặt tên khác nhau.

Các vấn đề liên quan