сравнить значения столбца с несколькими значениями в другом столбце по группе в R - PullRequest
1 голос
/ 03 июля 2019

У меня есть данные о сберегательных счетах физических лиц, и я наблюдаю сумму соглашения, а также даты открытия и закрытия. Вот данные о сбережениях потребителя:

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-05-26 потребитель открыл счет на 1039 $, затем пролонгировал его на 2015-11-26, а затем снова на 2016-05-26, затем на 2016-11-26 (1040 $) и наконец-то 2017-05-26 (1040 $).

Я могу идентифицировать эти учетные записи с ifelse(dt$opening %in% dt$closing, 1, 0), но этого явно недостаточно. Я не уверен, как действовать и какова обычная методология в таких случаях (интересно, было бы хорошим началом репликации всего набора данных).

Конечная цель - выяснить, внес ли кто-то сумму сбережений или уменьшил ее при пролонгации счета.

Надеюсь, это достаточно ясно. Любая помощь очень ценится!

1 Ответ

3 голосов
/ 03 июля 2019

Вы можете идентифицировать строки, чья дата 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...