R суммирует, когда даты в основной df попадают в диапазоны от маленькой df - PullRequest
0 голосов
/ 12 февраля 2020

Аналогично подходу do.call/lapply здесь и подходу data.table здесь , но оба имеют настройку:

  • MainDF с диапазоны данных и начальной даты / конечной даты
  • SubDF с вектором отдельных дат

Где пользователи ищут сводки всех диапазонов MainDF, которые перекрывают каждую дату SubDF. У меня есть

  • MainDF с данными и вектором отдельных дат
  • SubDF с диапазонами начальной / конечной даты

И я хочу добавить резюме к SubDF для нескольких строк данных MainDF, которые попадают в каждый диапазон SubDF. Пример:

library(lubridate)
MainDF <- data.frame(Dates = seq.Date(from = as.Date("2020-02-12"),
                                      by = "days",
                                      length.out = 10),
                     DataA = 1:10)
SubDF <- data.frame(DateFrom = as.Date(c("2020-02-13", "2020-02-16", "2020-02-19")),
                    DateTo = as.Date(c("2020-02-14", "2020-02-17", "2020-02-21")))
SubDF$interval <- interval(SubDF$DateFrom, SubDF$DateTo)

При использовании подхода data.table из второй ссылки, я полагаю, это должно быть что-то вроде:

MainDF[SubDF, on = .(Dates >= DateFrom, Dates <= DateTo), allow = TRUE][
, .(SummaryStat = max(DataA)), by = .(Dates)]

Но это ошибки с неиспользованными аргументами для on. На моих реальных данных я получил результат, используя (эквивалент) max(MainDF$DataA), но это было 3 повторения второго значения (В моих реальных данных последняя строка не будет работать, так как у нее нет значения для DateTo ). Я подозреваю, что использование MainDF$ означает, что я подрываю группировку.

Я подозреваю, что я близок, но я действительно изо всех сил пытаюсь разобраться с data.table мышлением для сложных случаев использования. Сводная статистика, которую я собираюсь сделать (например, данные):

  • Mean & Max данныхA
  • length(which(DataA > 3))
  • difftime(last(Dates), first(Dates), units = "mins")
  • Dates[which.max(DataA)]

Я добавил строку interval выше, так как справка data.table %between% предполагает, что можно использовать формат Dates %between% interval но в тексте не упоминаются ни интервалы / различия, ни примеры, и мои попытки уже терпят неудачу в других местах, поэтому я не хочу концентрироваться на улучшении моего бега, пока я не могу ходить!

Я сосредоточился на подходе data.table, поскольку он используется для аналогичной проблемы, но мне было интересно, можно ли вместо этого использовать dplyr s group_by / group_by_if? group_by_if .predicate, похоже, ограничен тестами на столбцах (например, являются ли они факторами), а не связан с данными в строках столбцов, но я могу ошибаться.

Заранее спасибо за любая помощь!

...