2016-02-10 5 views
1

The data.table выглядит следующим образомКак получить разницу дат внутри data.table

   AccId Balance BusinessDate flag_change 
      (fctr) (dbl)  (fctr)  (dbl) 
1 00000252-MMM-140 23550.85 2012-04-30   1 
2 00000252-MMM-140 23567.20 2012-05-31   1 
3 00000252-MMM-140 23579.49 2012-06-30   1 
4 00000252-MMM-140 23591.20 2012-07-31   1 
5 00000252-MMM-140 23603.89 2012-08-31   1 
6 00000252-MMM-140 23629.67 2012-09-30   1 
7 00000252-MMM-140 23642.15 2012-10-31   1 
8 00000252-MMM-140 23642.15 2012-11-30   0 
9 00000252-MMM-140 23652.26 2012-12-31   1 
10 00000252-MMM-140 23652.26 2013-01-01   0 

Теперь я хочу, чтобы вычислить дату, когда баланс был изменен для счетов. Я в идеале нуждаюсь в столбце, состоящем из разницы дат каждого BusinessDate для изменения остатка на accID, и если он не изменился в следующем BusinessDate, как показано ниже, он будет равен 0, и он перейдет на следующую дату и рассчитает разницу , В приведенном ниже примере я хотел бы иметь

1 00000252-MMM-140 23550.85 2012-04-30   1 1 
2 00000252-MMM-140 23567.20 2012-05-31   1 31 
3 00000252-MMM-140 23579.49 2012-06-30   1 30 
4 00000252-MMM-140 23591.20 2012-07-31   1 31 
5 00000252-MMM-140 23603.89 2012-08-31   1 31 
6 00000252-MMM-140 23629.67 2012-09-30   1 30 
7 00000252-MMM-140 23642.15 2012-10-31   1 31 
8 00000252-MMM-140 23642.15 2012-11-30   0 0 
9 00000252-MMM-140 23652.26 2012-12-31   1 61 

Однако я не могу понять, как этого добиться.

ответ

3

Мы можем преобразовать «data.frame» в «data.table», изменить «BusinessDate» на класс Date. Получить разницу между смежным 'BusinessDate' с diff, которые имеют «flag_change` не равно 0.

library(data.table) 
setDT(df1)[, BusinessDate:= as.Date(BusinessDate)] 
df1[flag_change!=0, Diff:= c(1,diff(BusinessDate)), by = AccId] 
head(df1,-1) 
#    AccId Balance BusinessDate flag_change Diff 
# 1: 00000252-MMM-140 23550.85 2012-04-30   1 1 
# 2: 00000252-MMM-140 23567.20 2012-05-31   1 31 
# 3: 00000252-MMM-140 23579.49 2012-06-30   1 30 
# 4: 00000252-MMM-140 23591.20 2012-07-31   1 31 
# 5: 00000252-MMM-140 23603.89 2012-08-31   1 31 
# 6: 00000252-MMM-140 23629.67 2012-09-30   1 30 
# 7: 00000252-MMM-140 23642.15 2012-10-31   1 31 
# 8: 00000252-MMM-140 23642.15 2012-11-30   0 NA 
# 9: 00000252-MMM-140 23652.26 2012-12-31   1 61 

EDIT: Добавлено by = AccId на основе @ K.Rohde Замечаний.

+0

Добавив 'by =" AccId "', вы можете сделать это для каждого отдельного значения 'AccId'. (В противном случае будут проблемы с перекрытием при изменении 'AccId'.) –

+0

Я имею в виду' df1 [flag_change! = 0, Diff: = c (1, diff (BusinessDate)), by = "AccId"] ' –

+0

@K .Rohde Спасибо за комментарий. Да, это должно быть так. – akrun