我的数据框看起来像这样
df <- read.table(text="
id date paid_at binded_at
1 107 2016-12-16 2017-06-02 2017-06-07
2 107 2017-11-27 2017-06-02 2017-06-07
3 107 2017-11-28 2017-06-02 2017-06-07
4 109 2016-11-28 2017-01-01 2017-06-07
5 109 2017-11-29 2017-01-01 2017-06-07
6 110 2017-12-04 2018-01-01 2017-06-07", header=TRUE)
目标是针对每个ID比较pay_at和日期列,并仅过滤比pay_at之间最接近的日期。例如ID 107,它的付款日期为2017-06-02,由于自此之后的最接近日期是2017-11-27,因此应过滤第二行。与ID 109相同,最接近的日期是2017年1月1日之后的2017年11月29日,因此请对其进行过滤。对我来说,问题是ID 110之类的情况,因为实际上没有日期在2018-01-01之后,因此应该在第六行进行过滤。结果应为
result <- read.table(text="
id date paid_at binded_at
1 107 2017-11-27 2017-06-02 2017-06-07
2 109 2017-11-29 2017-01-01 2017-06-07
3 110 2017-12-04 2018-01-01 2017-06-07", header=TRUE)
我还创建了以下代码:
result <- df %>%
group_by(id) %>%
filter(paid_at > date)
答案 0 :(得分:1)
一个选择是允许id
通过filter
仅获得一行,对于那些id
来说,任何条件都不匹配。
OP
所示的解决方案可以扩展为仅包含id
行的1
如下:
library(dplyr)
df %>% mutate_at(vars(2:4), as.Date) %>% #This step is to convert in Date format
group_by(id) %>%
filter(paid_at < date | n()==1) %>% #Include groups with single row
arrange(date) %>%
slice(1) #Select just 1 row
# # A tibble: 3 x 4
# # Groups: id [3]
# id date paid_at binded_at
# <int> <date> <date> <date>
# 1 107 2017-11-27 2017-06-02 2017-06-07
# 2 109 2017-11-29 2017-01-01 2017-06-07
# 3 110 2017-12-04 2018-01-01 2017-06-07