2014-10-14 2 views
-1

я в настоящее время есть две таблицы данных, которые выглядят следующим образом:обновление data.table на основе последних изменений в другой data.table

dt1 <- data.table(urn=c("1","1","1","1","1","1","1","2","2","2","2","3","3","3","3","3","3","3","2"), 
        date=as.Date(c("2014-01-15","2014-02-15","2014-03-15","2014-04-15","2014-05-15","2014-06-15","2014-07-15", 
         "2014-04-15","2014-05-15","2014-06-15","2014-07-15", 
         "2014-04-15","2014-03-15","2014-05-15","2014-02-15","2014-06-14","2014-08-15","2014-07-15","2014-09-16")), 
        amount=c(20,20,15,15,15,20,25, 
          15,15,20,20, 
          30,30,30,30,25,25,25,20)) 

#dt1 
# urn  date amount 
# 1: 1 2014-01-15  20 
# 2: 1 2014-02-15  20 
# 3: 1 2014-03-15  15 
# 4: 1 2014-04-15  15 
# 5: 1 2014-05-15  15 
# 6: 1 2014-06-15  20 
# 7: 1 2014-07-15  25 
# 8: 2 2014-04-15  15 
# 9: 2 2014-05-15  15 
#10: 2 2014-06-15  20 
#11: 2 2014-07-15  20 
#12: 3 2014-04-15  30 
#13: 3 2014-03-15  30 
#14: 3 2014-05-15  30 
#15: 3 2014-02-15  30 
#16: 3 2014-06-14  25 
#17: 3 2014-08-15  25 
#18: 3 2014-07-15  25 
#19: 2 2014-09-16  20 

dt2 <- data.table(urn=c("1","2","3"), lastamount=c(25,20,25),lastchangedate=as.Date(c(NA,NA,NA))) 

#dt2 
# urn lastamount lastchangedate 
# 1: 1   25   <NA> 
# 2: 2   20   <NA> 
# 3: 3   25   <NA> 

Несколько важных вещей, чтобы отметить, (1) Урна ISN» (2) дата не всегда правильно упорядочена, (3) сумма может повышаться или понижаться и (4) дата может пропустить месяц, и (5) дата не всегда в тот же день месяца.

То, что я пытаюсь достичь, - это способ обновить dt2 lastchangedate, чтобы отразить самую последнюю дату, когда сумма была изменена (увеличена или уменьшена).

Поэтому я ожидал бы, что dt2 будет выглядеть следующим образом после обработки.

#dt2 
# urn lastamount lastchangedate 
# 1: 1   25  2014-07-15 
# 2: 2   20  2014-06-15 
# 3: 3   25  2014-06-14 

Это, очевидно, образец данных. Чтобы дать порядок, мой реальный dt1 имеет записи 3,5 М, а dt2 имеет записи 250 КБ.

Благодаря

UPDATE: Как мой реальный dt2 имеет больше столбцов, чем только те, которые приведены в образце, мне нужно, чтобы иметь возможность держать их в своем окончательном выходе. Вместо того, чтобы перезаписывать текущий экземпляр dt2, я хотел просто обновить lastchangedate по отдельности. Ниже приведен код, который я использовал.

setkey(dt1, urn) # this is after I had used setkey(dt1, urn, date) to order dt1 properly 
setkey(dt2, urn) 

dt2[dt1[,list(lastchangedate=max(date[which(diff(amount)!=0)+1])), 
    by=urn],lastchangedate:=i.lastchangedate] 
+0

Являясь довольно новым для stackoverflow, я пытаюсь понять, как задавать полезные вопросы. Я бы очень признателен за отзывы о том, что об этом вопросе было бесполезно, поэтому я могу улучшить будущее. – Dan

ответ

1

Это следует сделать это:

setkey(dt1, urn, date) ## sort table 
dt2 <- dt1[, list(lastamount=amount[.N], 
        lastchangedate=max(date[which(diff(amount)!=0)+1])), 
      by=urn] 

Последняя строка смотрит на где diff(amount) != 0 и смещает его на один (индекс строки, в которых происходит изменение) и возвращает последнюю дату (max).

Смежные вопросы