Можно попробовать:
library(data.table)
df <- setDT(df)[, Stamp := as.Date(Stamp)][
, `:=` (mean_score = sapply(Stamp,
function(x)
mean(Score[between(Stamp, x - 7, x - 1)])
),
proportion_walk = sapply(Stamp,
function(x)
round(mean(
activity[between(Stamp, x - 7, x - 1)] == 'Walk'
),2)
)
), by = User][
is.nan(mean_score), `:=` (mean_score = 0, proportion_walk = 0)]
Выход:
User Stamp activity Score mean_score proportion_walk
1: 1 2019-06-20 Car 4500 625.000 0.50
2: 1 2019-06-18 Car 600 650.000 1.00
3: 1 2019-06-15 Walk 650 0.000 0.00
4: 1 2019-06-21 Ride 790 1916.667 0.33
5: 2 2019-06-21 Car 800 0.000 0.00
6: 2 2019-06-23 Car 500 800.000 0.00
7: 3 2019-06-11 Walk 900 0.000 0.00
8: 4 2019-06-15 Walk 200 900.000 1.00
9: 4 2019-06-12 Walk 900 0.000 0.00
Для proportion_walk
, я полагаю, в вашем выводе есть опечатка, основанная на вашем описании. В противном случае, пожалуйста, перефразируйте; например, 2019-06-20
не может иметь 0,33, поскольку есть 2 дня позади, и один из них - Walk
.