【问题标题】:R compare dates on next rowsR比较下一行的日期
【发布时间】:2018-12-16 01:02:13
【问题描述】:

我在 R 中有这个数据框

  raw_payment_id from_bank_account        amount posted_at 
           <int> <chr>                     <dbl> <date>    
1         620691 SK660900000000062087       20.0 2018-02-25
2         618433 SK660900000000062087       10.0 2018-02-27
3         623157 SK660900000000062087       10.0 2018-03-02
4         628236 SK300900000000506871      812.  2018-03-06
5         627899 SK300900000000506871      812.  2018-03-07
6         628966 SK660900000000062087       10.0 2018-03-09

我的目标是确定是否在 3 天内从同一帐户支付了相同金额的款项。如果是,则将两次付款都标记为 1。所以结果是。

  raw_payment_id from_bank_account        amount posted_at     test 
           <int> <chr>                     <dbl> <date>        <int> 
1         620691 SK660900000000062087       20.0 2018-02-25    0
2         618433 SK660900000000062087       10.0 2018-02-27    1
3         623157 SK660900000000062087       10.0 2018-03-02    1
4         628236 SK300900000000506871      812.  2018-03-06    1
5         627899 SK300900000000506871      812.  2018-03-07    1
6         628966 SK660900000000062087       10.0 2018-03-09    0

我找不到如何做到这一点的方法,我对滞后/领先的尝试失败了,因为银行账户可能只有一笔付款。

【问题讨论】:

  • 欢迎来到 Stack Overflow!以后请按照MCVEr 标签描述以reproducible 格式分享您的数据,例如使用dput()。干杯!
  • 无论如何,请使用lag/lead 发布您的代码,我们可能会修复它,例如添加带有from_bank_account=NA 的哨兵,否则处理特殊情况。

标签: r dataframe lag lead


【解决方案1】:
library(dplyr)


df %>% 
  group_by(from_bank_account, amount) %>% 
  mutate(var = case_when(abs(as.Date(posted_at) - as.Date(lag(posted_at))) < 4 ~ 1, 
                         abs(as.Date(posted_at) - as.Date(lead(posted_at))) < 4 ~ 1,
                         TRUE ~ 0))

  raw_payment_id from_bank_account    amount posted_at    var
           <int> <fct>                 <dbl> <fct>      <dbl>
1         620691 SK660900000000062087    20. 2018-02-25    0.
2         618433 SK660900000000062087    10. 2018-02-27    1.
3         623157 SK660900000000062087    10. 2018-03-02    1.
4         628236 SK300900000000506871   812. 2018-03-06    1.
5         627899 SK300900000000506871   812. 2018-03-07    1.
6         628966 SK660900000000062087    10. 2018-03-09    0.

【讨论】:

    【解决方案2】:
    library(dplyr)
    
    # Within each accounts, how many transactions were the same amount
    tmp <- mydat %>% 
      group_by(from_bank_account, amount) %>% 
      mutate(number_of_dupes = n()) %>% 
      filter(number_of_dupes > 1) # only keep duplicates
    
    # remove dups > 3 days apart
    tmp$dup <- 0
    
    for(i in 1:nrow(tmp)){
      acct <- tmp$from_bank_account[i]
      n    <- tmp$number_of_dupes[i]
    
      if(length(tmp$dup[(abs(difftime(tmp$posted_at[i],tmp$posted_at,units = "days")) < 4)
                        & (tmp$from_bank_account == acct)]) > 1){
        tmp$dup[i] <- 1
      }
    }
    tmp <- tmp[tmp$dup==1,]
    
    mydat$flag_duplicate <- ifelse(mydat$raw_payment_id %in% tmp$raw_payment_id,1,0)
    
      raw_payment_id    from_bank_account amount  posted_at flag_duplicate
    1         620691 SK660900000000062087     20 2018-02-25              0
    2         618433 SK660900000000062087     10 2018-02-27              1
    3         623157 SK660900000000062087     10 2018-03-02              1
    4         628236 SK300900000000506871    812 2018-03-06              1
    5         627899 SK300900000000506871    812 2018-03-07              1
    6         628966 SK660900000000062087     10 2018-03-09              0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-25
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      相关资源
      最近更新 更多