在按两列联接两个数据帧时如何忽略NA?

时间:2019-01-20 17:14:19

标签: r dataframe

我有两个数据框,我想通过忽略第二个数据框中的NA来按id和date加入。

dataset_A

id         date
e1234      2018-01-19
e1234      2018-01-14
e1234      2018-02-13
e2345      2018-07-18
e2345      2018-09-29
e2345      2018-10-10
e3456      2018-11-12  

dataset_B

id       date          item_id     item_name
e1234    2018-01-19    NA          NA
e1234    2018-01-19    75889       NA
e1234    2018-01-19    NA          biscuits
e1234    2018-01-19    NA          biscuits
e2345    2018-07-18    34567       NA
e2345    2018-09-29    NA          choclate
e2345    2018-10-10    NA          NA
e2345    2018-10-10    53566       icecream
e3456    2018-11-12    NA          NA
e3456    2018-11-12    NA          NA
e3456    2018-11-12    94585       NA
e3456    2018-11-12    94585       cake
e3456    2018-11-12    NA          cake

预期输出

id       date          item_id     item_name
e1234    2018-01-19    75889       biscuits
e1234    2018-01-14    NA          NA
e1234    2018-02-13    NA          NA
e2345    2018-07-18    34567       NA
e2345    2018-09-29    NA          choclate
e2345    2018-10-10    53566       icecream
e3456    2018-11-12    94585       cake   

尝试:

library(dplyr)
final_data = dplyr::left_join(dataset_A,dataset_B,by=c(id,date),ignore.na = T)

我希望有一个适当的解决方案来解决上述问题。

1 个答案:

答案 0 :(得分:1)

几乎。首先,您只需要整理一下数据即可。

dataset_B %>%
    group_by(id, date) %>%
    summarize(item_id = first(na.omit(item_id)),
           item_name = first(na.omit(item_name))) %>%
    right_join(., dataset_A)

# A tibble: 7 x 4
# Groups:   id [?]
  id    date       item_id item_name
  <fct> <chr>        <int> <fct>    
1 e1234 2018-01-19   75889 biscuits 
2 e1234 2018-01-14      NA NA       
3 e1234 2018-02-13      NA NA       
4 e2345 2018-07-18   34567 NA       
5 e2345 2018-09-29      NA choclate 
6 e2345 2018-10-10   53566 icecream 
7 e3456 2018-11-12   94585 cake     

说明na.omit()忽略NA值(duh),first()返回结果中的第一个值。正如我们之前按iddate进行分组一样,我们的summarize()将数据集很好地缩小为每个组的第一个非NA值。

注意事项::这种方法假定每个组中没有多个不同非NA值。