R имеет тенденцию работать лучше всего в векторизации, поэтому самый простой способ, который я вижу, это просто добавить столбец i к вашим данным. Использование expand.grid
создаст и общий тиббл (фрейм данных), где tot повторяется для каждого i.
Пока неясно, как вы хотите, чтобы ваша группировка и тому подобное работали, но это должно сблизить васна то, что вы хотите:
library(tidyverse)
tot =
tribble(
~month_1, ~month_3, ~id,
1, 2.3, 1,
5, 6.6, 2,
7, 7.65, 3,
9, 8.01, 4,
24, 23.9, 5,
24, 23.97, 6,
24, 23.61, 7,
24, 23.87, 8,
13, 13.07, 9)
expand_grid(i = seq(1,24) %>% as.numeric, tot) %>%
mutate(
month_2 = case_when(
month_1 >= i ~ i,
TRUE ~ NA_real_
),
diff = i - month_3,
w = case_when(
diff <= 0 ~ 1,
(diff >0) & (diff < 1) ~ 1-diff,
diff >= 1 ~ 0)
) %>%
group_by(i,month_3) %>%
mutate(COUNT = sum(w)) %>%
ungroup %>%
group_by(i,month_2) %>%
mutate(cars = floor(sum(w)))
Как только вы подведете итог, он удалит остальные столбцы, поэтому группировка по месяцу_2 будет невозможна. Если вы хотите сгруппировать по обоим, чтобы получить минимальную сумму w для каждого i, это тоже сработало бы, просто добавьте month_2 в group_by, например group_by(i,month_2,month_3) %>% summarize(cars = floor(sum(w))
.