I would use this with dplyr , tidyr and magrittr .
Data
df <- data.frame(ID=c(rep("a", 10), rep("b", 8), rep("c", 3), "d"), Date=c(paste("Day", 1:10), paste("Day", 1:8), paste("Day", 11:13), "Day 8"), Metric=c(9, 8, 9, 8, 7, 6, 5, 4, 3, 3, 6, 7, 6, 7, 8, 9, 9, 9, 3, 1, 8, 10))
the code
library(tidyr); library(dplyr); library(magrittr) df %<>% separate(Date, into=c("d1", "d2")) %>% arrange(ID, as.numeric(d2)) %>% group_by(ID) %>% mutate(last_Date=paste("Day", max(as.numeric(d2))), metric_Avg=mean(Metric), prev2=(lag(Metric)+lag(Metric, 2))/2, prev3=(lag(Metric)+lag(Metric, 2)+lag(Metric, 3))/3, prev4=(lag(Metric)+lag(Metric, 2)+lag(Metric, 3)+lag(Metric, 4))/4, prev5=(lag(Metric)+lag(Metric, 2)+lag(Metric, 3)+lag(Metric, 4)+lag(Metric, 5))/5) %>% ungroup %>% filter(last_Date==paste(d1, d2)) %>% select(ID, last_Date, metric_Avg, prev2, prev3, prev4, prev5) df
Exit
ID last_Date metric_Avg prev2 prev3 prev4 prev5 1 a Day 10 6.200 3.5 4.000 4.50 5.0 2 b Day 8 7.625 9.0 8.667 8.25 7.8 3 c Day 13 4.000 2.0 NA NA NA 4 d Day 8 10.000 NA NA NA NA
Note
If the Date column contains dates, use the lubridate package. first few lines of code:
df$Date <- ymd(df$Date)