我有两个数据框,我想通过忽略第二个数据框中的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)
我希望有一个适当的解决方案来解决上述问题。
答案 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()
返回结果中的第一个值。正如我们之前按id
和date
进行分组一样,我们的summarize()
将数据集很好地缩小为每个组的第一个非NA值。
注意事项::这种方法假定每个组中没有多个不同非NA值。