R-在数据框的日期之间过滤

时间:2018-07-15 16:57:10

标签: r date dataframe

我的数据框看起来像这样

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)

1 个答案:

答案 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