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  

したがって、すべての Date には複数の ID があり、それぞれに 1 つの 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)

動作しません。つまり、探しているものが得られません。

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 は、奇妙に順序付けられた要素や文字ではなく、日付型として格納されていると想定しています。もしそうなら、これはうまくいくはずです。「11/10/2013」と「11/9/2013」の同じIDのレコードを持って文字として保存してみて、文字として保存する際の問題点を確認してください。

于 2013-10-25T15:05:20.727 に答える