【问题标题】:R - filter between date from dataframeR - 在数据框的日期之间过滤
【发布时间】:2018-07-15 16:57:10
【问题描述】:

我的数据框是这样的

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 比较paid_at 和日期列,并仅过滤比paid_at 之间最接近的日期。例如 id 107 它是在 2017 年 6 月 2 日支付的,并且由于此后最近的日期是 2017 年 11 月 27 日,因此应过滤第二行。 id 109 相同,2017-01-01 之后的最近日期是 2017-11-29,所以过滤它。对我来说问题是 id 110 之类的情况,因为实际上在 2018-01-01 之后没有日期,因为这应该被过滤到第 6 行。结果应该是

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)

【问题讨论】:

  • 您的read.table 命令不起作用,建议您删除&lt;type&gt; 行。

标签: r date dataframe


【解决方案1】:

一个选项是允许id 仅通过filter 获得一行,因为对于那些ids 任何条件都不会匹配。

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

【讨论】:

  • 谢谢,但我收到错误 - mutate_impl(.data, dots) 中的错误:评估错误:字符串不是标准的明确格式。
  • @Jack_Carver 可能是某些日期的格式不正确。您是在尝试样本数据还是不同的数据集?
  • 谢谢,我找到了问题,请问 n()==1 是什么意思?
  • n()==1 表示该组(在您的情况下为id)的记录数为1n() 提供组的行数。
猜你喜欢
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多