Вы можете использовать rowwise()
в этом случае, чтобы указать dplyr
для оценки df
строка за строкой:
df %>%
rowwise() %>%
mutate(sum_value = df_time %>%
filter(Time > from, Time <= to) %>%
pull(value) %>%
sum()) %>%
ungroup() # ungroup is used to restore default behaviour of dplyr
#> # A tibble: 3 x 3
#> from to sum_value
#> <date> <date> <dbl>
#> 1 1970-01-04 1970-01-09 121
#> 2 1970-01-07 1970-01-08 13
#> 3 1970-01-21 1970-01-25 204
Вот как я поступил бы, так как считаю код простым для понимания. Но, насколько я понимаю, в основном он все еще находится под капотом oop.
Другой и потенциально более быстрый подход может заключаться в использовании data.table
. Я не так хорошо знаком с синтаксисом, поэтому может быть способ получше, но это работает:
library(data.table)
# convert to data.table
df_time <- setDT(df_time)
df <- setDT(df)
# duplicate Time column since foverlaps needs two of them
df_time <- df_time[, Time2 := Time]
# Since from day should not be included
df <- df[, from := from + 1]
setkey(df, from, to)
res <- foverlaps(df_time, df, by.x = c("Time", "Time2"), by.y = c("from", "to"), type = "within")
res <- res[, .(value = sum(value)), keyby = .(from, to)]
res[, from := from - 1]
#> from to value
#> 1: <NA> <NA> 4622
#> 2: 1970-01-04 1970-01-09 121
#> 3: 1970-01-07 1970-01-08 13
#> 4: 1970-01-21 1970-01-25 204