2016-10-05 10 views
0

У меня есть кадр пересмотра данных с 3-мя столбцами:R: извлечь последнюю revisionTime для каждой даты

  1. revisionTime
  2. Дата
  3. значение

Например вот пример, но мой очень длинный (несколько сотен тысяч рядов)

df = structure(list(revisionTime = structure(c(1471417781, 1471417781, 
1471417781, 1473978576, 1473978576, 1473978576), class = c("POSIXct", 
"POSIXt"), tzone = ""), date = structure(c(1464652800, 1467244800, 
1469923200, 1456704000, 1467244800, 1472601600), class = c("POSIXct", 
"POSIXt"), tzone = ""), value = c(103.7, 104.1, 104.9, 104.414, 
104.3, 104.4)), .Names = c("revisionTime", "date", "value"), row.names = 536:541, class = "data.frame") 

Что мне нужно, это очень быстрый способ извлечь из этого data.frame последнюю версиюTime для каждой даты (и соответствующее значение). Есть несколько подобных вопросов, но мой вопрос более точный: есть ли способ избежать петель?

Спасибо

ответ

0

Мы можем использовать data.table. Преобразуйте 'data.frame' в 'data.table' (setDT(df1)), сгруппированные по 'дате' после преобразования в Date класс, order «revisionTime» в порядке убывания (в i) и получите первую строку с head.

library(data.table) 
setDT(df1)[order(-revisionTime), head(.SD, 1), .(date = as.Date(date))] 
+0

Не будет 'df%>% group_by (date)%>% sumize (lastrevisionTime = last (revisionTime))' из 'dplyr'work? – Haboryme

+0

@Haboryme Здесь вы предполагаете, что revisionTime заказано, вам может потребоваться «организовать» между ними. – akrun

0

Если revisionTime красиво отформатирован (Ymd H: M: S) всегда, как в вашем примере, вы можете не нужно конвертировать время Даты вообще, это должно просто работать:

aggregate(revisionTime ~ date, df, max) 
+0

Спасибо. Думаю, у меня есть для 'plyr :: join' 2 data.frames, чтобы получить соответствующие значения? – RockScience

+0

У вас есть второй фрейм данных? –

+0

ОК, моя ошибка, когда я снова прочитал свой вопрос: мне действительно нужно «значение», соответствующее последнему редактору времени, поэтому мое непонимание вашего ответа. – RockScience