在R中按组比较一列的值与另一列中的多个值

时间:2019-07-03 14:43:29

标签: r

我有个人储蓄帐户的数据,我观察协议的金额以及开始和结束日期。这是消费者的储蓄数据:

amount <- c(1004, 1004, 1240, 1039, 1240, 1039, 1039, 1240, 1040, 1040)  
opening <- as.Date(c('2012-11-19', '2013-05-20', '2014-06-13', '2015-05-26',
    '2015-06-13', '2015-11-26', '2016-05-26', '2016-06-13', '2016-11-26',
    '2017-05-26'))  
closing <- as.Date(c('2013-05-20', '2013-11-20', '2015-06-13', '2015-11-26',
    '2016-06-13', '2016-05-26', '2016-11-26', '2017-06-13', '2017-05-26',
    '2017-07-10'))

dt <- data.frame(amount, opening, closing) 
   amount    opening    closing
     1004 2012-11-19 2013-05-20
     1004 2013-05-20 2013-11-20
     1240 2014-06-13 2015-06-13
     1039 2015-05-26 2015-11-26
     1240 2015-06-13 2016-06-13
     1039 2015-11-26 2016-05-26
     1039 2016-05-26 2016-11-26
     1240 2016-06-13 2017-06-13
     1040 2016-11-26 2017-05-26
     1040 2017-05-26 2017-07-10

我的任务如下:我想确定所有已滚存的帐户。换句话说,我想跟踪所有储蓄金额,并查看消费者是否在同一天关闭并重新开设了该帐户(自动更新储蓄帐户)。例如,在2015年5月26日,消费者开设了一个1039美元的帐户,然后在2015年11月26日将其展期,然后在2016年5月26日再次滚动,然后在2016年11月26日(1040美元)终于在2017-05-26(1040 $)。

我可以用ifelse(dt$opening %in% dt$closing, 1, 0)标识那些帐户,但这显然是不够的。我不确定如何进行处理以及在这种情况下通常的方法(我想知道复制整个数据集是否是一个好的开始)。

最终目标是找出在结转帐户时是否有人为储蓄额供款或减少了储蓄额。

希望这很清楚。非常感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

您可以使用自联接来标识具有相同closing值的opening日期等于另一行amount日期的行。在下面的输出中,它们将是不丢失rollover_opening的行。要回答您要查询的实际问题,数据将需要包含更多信息。

library(data.table)
setDT(dt)

dt[dt, on = .(amount, closing = opening), rollover_opening := i.opening]

dt
#     amount    opening    closing rollover_opening
#  1:   1004 2012-11-19 2013-05-20       2013-05-20
#  2:   1004 2013-05-20 2013-11-20             <NA>
#  3:   1240 2014-06-13 2015-06-13       2015-06-13
#  4:   1039 2015-05-26 2015-11-26       2015-11-26
#  5:   1240 2015-06-13 2016-06-13       2016-06-13
#  6:   1039 2015-11-26 2016-05-26       2016-05-26
#  7:   1039 2016-05-26 2016-11-26             <NA>
#  8:   1240 2016-06-13 2017-06-13             <NA>
#  9:   1040 2016-11-26 2017-05-26       2017-05-26
# 10:   1040 2017-05-26 2017-07-10             <NA>

另一个选择:

dt[dt, on = .(closing = opening), rollover_amount := i.amount][]
#     amount    opening    closing rollover_amount
#  1:   1004 2012-11-19 2013-05-20            1004
#  2:   1004 2013-05-20 2013-11-20              NA
#  3:   1240 2014-06-13 2015-06-13            1240
#  4:   1039 2015-05-26 2015-11-26            1039
#  5:   1240 2015-06-13 2016-06-13            1240
#  6:   1039 2015-11-26 2016-05-26            1039
#  7:   1039 2016-05-26 2016-11-26            1040
#  8:   1240 2016-06-13 2017-06-13              NA
#  9:   1040 2016-11-26 2017-05-26            1040
# 10:   1040 2017-05-26 2017-07-10              NA