#r #loops #date #dataframe #revision
#r #циклы #Дата #фрейм данных #пересмотр
Вопрос:
У меня есть фрейм данных ревизии с 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")
Что мне нужно, так это очень быстрый способ извлечения из этих данных. создайте последнее время пересмотра для каждой даты (и соответствующее значение). Есть несколько похожих вопросов, но мой вопрос более точный: есть ли способ избежать циклов?
Спасибо
Ответ №1:
Мы можем использовать data.table
. Преобразуйте ‘data.frame’ в ‘data.table’ ( setDT(df1)
), сгруппированные по ‘date’ после преобразования в Date
class, order
‘revisionTime’ в порядке убывания (в i
) и получите первую строку с head
помощью .
library(data.table)
setDT(df1)[order(-revisionTime), head(.SD, 1), .(date = as.Date(date))]
Комментарии:
1. Не
df%>%group_by(date)%>%summarise(lastrevisionTime=last(revisionTime))
было бы сdplyr
работы?2. @Haboryme Здесь вы предполагаете, что время пересмотра упорядочено, вам может понадобиться
arrange
промежуточный период.
Ответ №2:
Если ваше время пересмотра отформатировано правильно (Y-m-d H: M: S) всегда, как в вашем примере, вам может вообще не потребоваться преобразование в время даты, это должно просто работать:
aggregate(revisionTime ~ date, df, max)
Комментарии:
1. Спасибо. Я предполагаю, что у меня есть
plyr::join
2 data.frames для получения соответствующих значений?2. У вас тоже есть 2-й фрейм данных?
3. хорошо, моя ошибка, когда я снова перечитываю свой вопрос: мне действительно нужно
the value
соответствовать последнему времени пересмотра, отсюда и мое непонимание вашего ответа.4. max предоставит вам последнее время пересмотра для каждой даты.
5. действительно. затем я могу объединить или объединить с исходным data.frame, чтобы получить соответствующее значение. Спасибо