如何通过ID和年份查找R数据框中的先前值?

时间:2019-03-04 21:11:14

标签: r

说我有一个看起来像这样的数据框:

  ID Year Value    Value_Prior.Year
 aaa 2010   800               
 bbb 2010  1000               
 ccc 2010   900
 ccc 2010   400      
 aaa 2011   400               
 bbb 2011   300               
 ccc 2011   100
 bbb 2013   100      

我想通过匹配ID和Year-1来填写“ Prior Year”列。如果它们不是唯一的,我想对与ID和Year-1相匹配的所有其他条目进行求和。我创建了一个for循环,该循环将起作用,但是鉴于实际数据的大小,我试图找到一个更快的选项。

编辑:可能会丢失一些年,并且有些重复。因此,在上面的示例中,最后一个“ Value_Prior.Year”应为NA,倒数第二个值应为总和或1300。

谢谢!

1 个答案:

答案 0 :(得分:1)

这里是只使用基数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