我有一个由以下列组成的数据框(简化): 日期,身份证,价格:
Date ID Price
1/2/2013 05947U4Q8 25
1/2/2013 05947UT40 9.40264
1/2/2013 07387BAW3 8.75
1/2/2013 07387BBJ1 4.4861
1/2/2013 07387BEQ2 5
1/2/2013 12513EAY0 6
1/2/2013 20047PAS6 33
1/3/2013 05947UT40 9.40414
1/3/2013 07387BAW3 8.75
1/3/2013 07387BBJ1 4.4742
1/3/2013 07387BEQ2 5
1/3/2013 12513EAY0 6
1/3/2013 20047PAS6 33
因此,对于每个日期,都有几个ID,每个都有一个Price。 ID可能会从一天变为另一天(有些会下降,有些会被添加)。我想要计算的是,每天,每个ID的价格变化(如果ID的价格在前一天已知)。因此,对于上面的示例,输出应为:
Date ID Price change
1/3/2013 05947UT40 0.0015
1/3/2013 07387BAW3 0
1/3/2013 07387BBJ1 -0.0119
1/3/2013 07387BEQ2 0
1/3/2013 12513EAY0 0
1/3/2013 20047PAS6 0
天真地使用:
tapply(dataSet$Price, as.Date(dataSet$Date), diff)
不起作用,即不能给我我正在寻找的东西。
答案 0 :(得分:1)
dt <- data.table(dt)
setkey(dt,ID,Date)
dt[,pricediff:= Price - c(NA,head(Price,-1)), by = ID][!is.na(pricediff)]
我假设Date存储为日期类型,而不是一些奇怪的有序因素或字符。如果是这样,那么这应该工作。尝试为“11/10/2013”和“11/9/2013”创建相同ID的记录,并将其存储为字符,以查看将其存储为字符的问题。