【发布时间】:2020-09-14 09:18:01
【问题描述】:
我会尽量让这件事变得简单,如果可能的话,我想要一个dplyr 解决方案:
假设我有一个 DataFrame 的 2 个 columns 称为 f1。两列是事件的参考编号,date_begin 是事件的开始日期:
f1
reference date_begin
1 01100144609598 2020-08-15
2 01100144692499 2020-08-12
3 01100144609598 2020-08-09
4 01100434045112 2020-08-26
5 01100434067379 2020-08-24
6 01100723546188 2020-08-16
我还有另一个 DataFrame 称为 f2 和 2 columns。两列是事件的参考编号,date_end 是事件的结束日期:
reference date_end
1 01100144609598 2020-09-06
2 01100144692499 2020-08-10
3 01100434121179 2020-08-25
4 01100578756185 2020-08-17
5 01100578757962 2020-08-31
6 01100578846401 2020-08-16
我想通过引用使用full_join。话虽这么说:
- 如果在开始日期之前有结束日期,我想要一个 NA 而不是开始日期
- 结束日期必须大于开始日期
- 如果同一参考有 2 个结束日期大于开始日期,则取最小的结束日期
- 如果有一个没有结束日期的开始日期,则结束日期应该有一个 NA
因此,在这个可重现的示例中,我应该有一个 f3,如下所示:
reference date_begin date_end
1 01100144609598 2020-08-15 2020-09-06
2 01100144692499 NA 2020-08-10
3 01100144692499 2020-08-12 NA
4 01100434121179 NA 2020-08-25
5 01100578756185 NA 2020-08-17
6 01100578757962 NA 2020-08-31
7 01100578846401 NA 2020-08-16
8 01100144609598 2020-08-09 NA
9 01100434045112 2020-08-26 NA
10 01100434067379 2020-08-24 NA
11 01100723546188 2020-08-16 NA
【问题讨论】:
-
如果你这样做
full_join(f1, f2, by = 'reference')它有 10 行。为什么你的输出中有 11 行?同样对于第 2 点,当结束日期不大于开始日期时会发生什么? -
我想要 11,因为参考 01100144609598,第一个的结束日期在开始日期之后,因此 f2 和 f1 数据框的行可以是一个。 Full_join 为您提供 10,因为第二个参考编号是相同的,但是结束在开始之前,因此不允许它们在同一行上。当结束日期不大时,它应该与开始日期在同一行,就像示例中 f3 中的第一行一样