Как рассчитать сумму для текущей строки с условием на значения других строк в другом столбце - PullRequest
0 голосов
/ 24 мая 2018

У меня есть датафрейм, как показано ниже:

ID Group SubmitDate   BookDate      Amount Total
1     A  2011-01-01   2011-01-01    100    0
2     A  2011-10-01   2011-05-01      0    100
3     B  2012-01-01   2012-02-20    500    0
4     B  2012-02-01   2012-04-01    300    0
5     B  2012-03-01   2012-03-15    400    500
6     B  2012-03-16   2012-03-18    900    900 

Я хочу Сумма для каждого идентификатора, которая равна сумме Сумма для предыдущих строк в той же группе, если SubmitDate текущей строки после BookDate предыдущегострок.

т.е. для идентификатора 5, SubmitDate идентификатора 5 только после BookDate идентификатора 3 (мы смотрим только идентификаторы в той же группе), то всего = 500

для идентификатора 6, SubmitDateс идентификатором 6 только после BookDate с идентификаторами 3 и 5 (мы рассматриваем только идентификаторы в той же группе), затем всего = 500 + 400 = 900

, чтобы восстановить этот пример

data <- data.frame(ID = c(1,2,3,4,5,6),
               Group = c("A","A","B","B","B","B"),
               SubmitDate = as.Date(c("2011-01-01","2011-10-01","2012-01-01","2012-02-01","2012-03-01","2012-03-16")),
               BookDate = as.Date(c("2011-01-01","2011-05-01","2012-02-20","2012-04-01","2012-03-15","2012-03-18")),
               Amount = as.numeric(c("100","0","500","300","400","900")))

Я думал об этом, но он сравнивает только submitl и bookDate текущих строк.

data %>% group_by(Group) %>% mutate(Total= cumsum( SubmittalDate <BookedDate ) ) 

1 Ответ

0 голосов
/ 24 мая 2018

Предположим, что есть опечатка и итоговое значение для ID == 4 равным 0 и для ID == 2 равным 100, и что OP не возражает против решения с использованием пакета data.table.Вот подход:

library(data.table)
setDT(data)
data[, Total :=
    data[data, sum(x.Amount[-.N][x.BookDate[-.N] < i.SubmitDate]), by=.EACHI, on=.(Group)]$V1
]

#   ID Group SubmitDate   BookDate Amount GrpID Total
#1:  1     A 2011-01-01 2011-01-01    100     1     0
#2:  2     A 2011-10-01 2011-05-01      0     2   100
#3:  3     B 2012-01-01 2012-02-20    500     1     0
#4:  4     B 2012-02-01 2012-04-01    300     2     0
#5:  5     B 2012-03-01 2012-03-15    400     3   500
#6:  6     B 2012-03-16 2012-03-18    900     4   900

Пояснения:

1) data[data, j=..., by=.EACHI, on=.(Group)] выполняет самостоятельное объединение, используя Group и выполняет j для каждой строки в i.См. ?data.table, чтобы понять значение i, j, by, .EACHI и on.. является псевдонимом для list.

3) В соединении x[i, ...] (т. Е. X объединяется с i), x.* относится к столбцам в таблице x слева от [.x.BookDate[-.N] принимает столбец BookDate минус последний столбец, который является текущей строкой.

4) x.Amount[-.N][x.BookDate[-.N] < i.SubmitDate] подмножество и суммирует суммы, которые удовлетворяют требованиям OP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...