Using dplyr, many operations can be vectorized. Here you can use lag(var1) to get a shifted version of var1. So computing the mean on consecutive rows can be done with:
df %>%
mutate(new_v1 = (var1+lag(var1))/2)
# A tibble: 11 x 6
# id year var1 var2 var3 new_v1
# <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
# 1 1 2010/2011 10 43 13 NA
# 2 1 2011/2012 6 13 14 8
# 3 1 2012/2013 13 21 31 9.5
# 4 1 2013/2014 17 24 24 15
# 5 2 2010/2011 15 31 21 16
# 6 2 2012/2013 21 42 27 18
# 7 2 2013/2014 30 16 33 25.5
# 8 3 2010/2011 15 32 21 22.5
# 9 3 2011/2012 31 34 23 23
# 10 3 2012/2013 10 51 24 20.5
# 11 3 2013/2014 6 19 29 8
But you want to compute this separately for each id! Actually, group_by() lets you do it directly:
df %>%
group_by(id) %>%
mutate(new_v1 = (var1+lag(var1))/2)
# A tibble: 11 x 6
# Groups: id [3]
# id year var1 var2 var3 new_v1
# <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
# 1 1 2010/2011 10 43 13 NA
# 2 1 2011/2012 6 13 14 8
# 3 1 2012/2013 13 21 31 9.5
# 4 1 2013/2014 17 24 24 15
# 5 2 2010/2011 15 31 21 NA
# 6 2 2012/2013 21 42 27 18
# 7 2 2013/2014 30 16 33 25.5
# 8 3 2010/2011 15 32 21 NA
# 9 3 2011/2012 31 34 23 23
# 10 3 2012/2013 10 51 24 20.5
# 11 3 2013/2014 6 19 29 8
So the hard part is done, you need to do that for each variable, remove the unneeded lines (with filter() and is.na()), and reformat the year (look at separate()). Also, don't forget to ungroup(), or some of the next operations might give you surprising results!