1

我有一个包含以下列(简化)的数据框:日期、ID、价格:

 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,每个 ID 都有一个价格。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)

不起作用,即没有给我我正在寻找的东西。

4

1 回答 1

1
dt <- data.table(dt)
setkey(dt,ID,Date)
dt[,pricediff:= Price - c(NA,head(Price,-1)), by = ID][!is.na(pricediff)]

我假设 Date 存储为日期类型,而不是一些奇怪的排序因素或字符。如果是这样,那么这应该工作。尝试为“2013 年 11 月 10 日”和“2013 年 11 月 9 日”创建相同 ID 的记录并将其存储为字符以查看将其存储为字符的问题。

于 2013-10-25T15:05:20.727 回答