说我有一个看起来像这样的数据框:
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。
谢谢!
答案 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