Здесь однострочник, использующий только основание R.
transform(DF, PriorYearValue = ave(Value, ID, FUN = function(x) c(NA, head(x, -1))))
, дающий:
ID Year Value PriorYearValue
1 aaa 2010 800 NA
2 bbb 2010 1000 NA
3 ccc 2010 900 NA
4 aaa 2011 400 800
5 bbb 2011 300 1000
6 ccc 2011 100 900
Примечание
Вход в воспроизводимом виде предполагается равным:
Lines <- "
ID Year Value
aaa 2010 800
bbb 2010 1000
ccc 2010 900
aaa 2011 400
bbb 2011 300
ccc 2011 100"
DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE)
Обновление
Что касается EDIT, который был добавлен к вопросу, сложные объединения легко выполняются в SQL, поэтому:
Lines <- '
ID Year Value
aaa 2010 800
bbb 2010 1000
ccc 2010 900
ccc 2010 400
aaa 2011 400
bbb 2011 300
ccc 2011 100
bbb 2013 100'
DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE)
library(sqldf)
sqldf("select a.*, sum(b.Value) PrevYearValue
from DF a
left join DF b on a.ID = b.ID and a.Year - 1 = b.Year
group by a.rowid")
, что дает:
ID Year Value PrevYearValue
1 aaa 2010 800 NA
2 bbb 2010 1000 NA
3 ccc 2010 900 NA
4 ccc 2010 400 NA
5 aaa 2011 400 800
6 bbb 2011 300 1000
7 ccc 2011 100 1300
8 bbb 2013 100 NA