2015-05-29 27 views
7

Tôi có khung hai dữ liệu bằngdplyr inner_join bằng NA trên các cột nhân vật

a <- c(1,2,3) 
b <- c(3,2,1) 
c <- c('a','b',NA) 

df1 <- data.frame(a=a, b=b, c=c, stringsAsFactors=FALSE) 
df2 <- data.frame(a=a, b=b, c=c, stringsAsFactors=FALSE) 

Tôi muốn sử dụng dplyr::inner_join để

"trả lại tất cả các hàng từ x nơi có phù hợp với giá trị trong y, và tất cả các cột từ x và y "dplyr documentation

(mọi thứ giống nhau) nhưng dường như không hoạt động với NA trong cột c (loại chr). Hành vi chuẩn này có không tham gia vào số NA không?

Ví dụ

library(dplyr) 
> inner_join(df1, df2) 
Joining by: c("a", "b", "c") 
    a b c 
1 1 3 a 
2 2 2 b 

không tham gia vào NA. Tuy nhiên, tôi muốn nó trở lại giống như merge

> merge(df1, df2) 
    a b c 
1 1 3 a 
2 2 2 b 
3 3 1 <NA> 

Tôi đã hiểu lầm như thế nào inner_join công trình trong trường hợp này và hành xử này như mô tả?

Xem chi tiết thêm

inner_join trận NA trên một cột số

a <- c(1,2,3) 
b <- c(3,2,NA) 
c <- c('a','b','c') 

df1 <- data.frame(a=a, b=b, c=c, stringsAsFactors=FALSE) 
df2 <- data.frame(a=a, b=b, c=c, stringsAsFactors=FALSE) 

> inner_join(df1, df2) 
Joining by: c("a", "b", "c") 
    a b c 
1 1 3 a 
2 2 2 b 
3 3 NA c 

Sửa

Như @thelatemail chỉ ra, inner_join cũng hoạt động như merge khi NA là trong một cột yếu tố

df1 <- data.frame(a=a, b=b, c=c, stringsAsFactors=T) 
df2 <- data.frame(a=a, b=b, c=c, stringsAsFactors=T) 
inner_join(df1, df2) 
Joining by: c("a", "b", "c") 
    a b c 
1 1 3 a 
2 2 2 b 
3 3 3 <NA> 

Chỉnh sửa 2

Nhờ @shadow để chỉ ra đây là một vấn đề được biết herehere

+0

đẹp câu hỏi và các ví dụ cũng được trình bày. Thật thú vị khi lưu ý rằng 'inner_join' cũng hoạt động như dự định khi sử dụng dữ liệu ký tự được lưu trữ dưới dạng' factor's, ví dụ: thay đổi ví dụ đầu tiên của bạn 'df1 $ c <- factor (df1 $ c); df2 $ c <- yếu tố (df2 $ c); inner_join (df1, df2) ' – thelatemail

+0

Đây là vấn đề đã biết. Xem [tại đây] (https://github.com/hadley/dplyr/issues/1022) hoặc [tại đây] (https://github.com/hadley/dplyr/issues/892) – shadow

+0

Cảm ơn @shadow, tôi sẽ giữ một mắt ra cho một sửa chữa. – tospig

Trả lời

0

Vấn đề này đã xảy ra trong phiên bản 0.4.1. Điều này bây giờ là cố định trong phiên bản 0.4.2:

sessionInfo() 
... 
other attached packages: 
[1] dplyr_0.4.2 
... 

> inner_join(df1, df2) 
Joining by: c("a", "b", "c") 
    a b c 
1 1 3 a 
2 2 2 b 
3 3 1 <NA> 

Kiểm tra với merge:

> merge(df1, df2) 
    a b c 
1 1 3 a 
2 2 2 b 
3 3 1 <NA> 

> all.equal(inner_join(df1, df2), merge(df1, df2)) 
Joining by: c("a", "b", "c") 
[1] TRUE 
Các vấn đề liên quan