Как подобрать таблицу по дате и последовательности?

Мне нужно подмножить таблицу несколькими условиями.

df <- data.frame(id=c("A","A","B","B","B","C"), seq=c(1,2,1,2,3,1), date=as.Date(c("2005-10-01", "2008-12-01","2001-03-05","2004-05-09","2008-10-15","2010-02-27")), value=c(20,12,80,55,77,57))


  id  | seq  |     date    | value
 --------------------------------
  A   |  1   | 2005-10-01  |  20
  A   |  2   | 2008-12-01  |  12
  B   |  1   | 2001-03-05  |  80
  B   |  2   | 2004-05-09  |  55
  B   |  3   | 2008-10-15  |  77
  C   |  1   | 2010-02-27  |  57

Мне нужен метод, который возвращает ровно одно значение для каждого идентификатора. В частности, значение с наивысшей последовательностью с датой меньше или равно заданной дате . Учитывая, что 2004-07-01 , он должен вернуться:

id  |  value
--------------
A   |   20
B   |   55
C   |   57

(Обратите внимание, что в специальном случае, когда дата меньше первой даты, она должна вернуть seq = 1, а не ничего)

Это возможно? За один присест?

1
nl ja de

1 ответы

Что-то вроде этого?

with(df[df$date >= as.Date("2004-07-01"),], do.call("rbind", lapply(split(data.frame(id, value,seq), id), function(x) x[which.max(x$value), c("id", "value")])))
  id value
A  A    20
B  B    77
C  C    57
1
добавлено
Я заметил, что результат был другим, но это потому, что значение 55 для id B находится перед желаемой начальной точкой, или я чего-то не хватает?
добавлено автор johannes, источник
Последнее сообщение перед указанной датой, или сообщение с наибольшим значением seq, до указанной даты?
добавлено автор johannes, источник
Хорошее усилие! Однако он не дает правильного ответа.
добавлено автор jenswirf, источник
Данная дата скорее является «конечной точкой». Мне нужно последнее сообщение до данной даты. ( Если нет сообщений до указанной даты, тогда я просто хочу первый пост)
добавлено автор jenswirf, источник
+1 приятный лайнер!
добавлено автор Ben, источник