2017-12-12 10 views
1

あるカラムから前の値を取得し、それを別のカラムに入れることについて少し質問があります。カラムからの前の値の取得とRの差分の取得

次のようにdput出力である:

structure(list(Time = structure(c(1122855314, 1122855315, 1122855316, 
1122855317, 1122855318, 1122855319, 1122855320, 1122955811, 1122955812, 
1122955813, 1122955814, 1123027212, 1123027213, 1123027214, 1123027215, 
1123027216, 1123027217), class = c("POSIXct", "POSIXt"), tzone = "Australia/Melbourne"), 
`Inventory_{t}` = c(0, 2, 2, 2, 5, 8, 3, 7, 6, 6, 1, 0, 1, 
1, 3, 3, 3), `Inventory_{t-1}` = c(0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), `Delta Inventory_{t-1}` = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("Time", 
"Inventory_{t}", "Inventory_{t-1}", "Delta Inventory_{t-1}"), row.names = c(NA, 
-17L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x00000000028b0788>) 

I「はInventory_ {T「埋める」たい私は次のように(簡単xtsオブジェクトに変換することができる)data.tableオブジェクトを持っています-1} "と呼び、1秒前に" Inventory_ {t} "にあった値を取り、それをそのセルに入れます。同様に、「デルタ・インベントリ_ {t-1}」については、Delta Inventory_{t-1} = Inventory_{t-1} - Inventory_{t-2} と同じにしておきたいと思います。毎日の開始時に、「インベントリ_ {t-1}」および「デルタ・インベントリ_ {T-1}」この情報を0

でなければならない、私はこのようになります新しいdata.table/xtsオブジェクトを取得したいと思います:物事

structure(list(Time = structure(c(1122855314, 1122855315, 1122855316, 
1122855317, 1122855318, 1122855319, 1122855320, 1122955811, 1122955812, 
1122955813, 1122955814, 1123027212, 1123027213, 1123027214, 1123027215, 
1123027216, 1123027217), class = c("POSIXct", "POSIXt"), tzone = "Australia/Melbourne"), 
`Inventory_{t}` = c(0, 2, 2, 2, 5, 8, 3, 7, 6, 6, 1, 0, 1, 
1, 3, 3, 3), `Inventory_{t-1}` = c(0, 0, 2, 2, 2, 5, 8, 0, 
7, 6, 6, 0, 0, 1, 1, 3, 3), `Delta Inventory_{t-1}` = c(0, 
0, 2, 0, 0, 3, 3, 0, 7, -1, 0, 0, 0, 1, 0, 2, 0)), .Names = c("Time", 
"Inventory_{t}", "Inventory_{t-1}", "Delta Inventory_{t-1}"), row.names = c(NA, 
-17L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x00000000028b0788>) 

があり、この問題は非常に簡単です私がループを使って解決するなら、私は非常に速い方法でこれを行うことを望んでいたので、誰もがこれで私を助けることができたら、私は本当にそれを感謝します、事前に感謝します。

+2

してください、 'data.table'パッケージで'シフト() '関数を見てみましょう。 – Uwe

+0

@Uweありがとう、それゆえ、それは 'シフト(z $'インベントリ_ {t} '、タイプ="遅れ "、塗りつぶし= 0)'の外観では、動作しているようだが、私は一日でそれを行うことができますか? (すなわち、 'Inventory_ {t-1}'列が0を最初の日として0にするにはどうすればいいですか?) – reallybadstatdude

答えて

1

これはshift()機能を使用して解決できます。営業担当者は、毎日新たに計算を再開することを要求しています。これは、by =パラメータによって達成される:

z[, `:=`(`Inventory_{t-1}` = shift(`Inventory_{t}`, fill = 0), 
     `Delta Inventory_{t-1}` = shift(`Inventory_{t}`, fill = 0) - 
      shift(`Inventory_{t}`, n = 2L, fill = 0)), by = .(Day = as.Date(Time))][] 
    Time Inventory_{t} Inventory_{t-1} Delta Inventory_{t-1} 
1: 2005-08-01 10:15:14    0    0      0 
2: 2005-08-01 10:15:15    2    0      0 
3: 2005-08-01 10:15:16    2    2      2 
4: 2005-08-01 10:15:17    2    2      0 
5: 2005-08-01 10:15:18    5    2      0 
6: 2005-08-01 10:15:19    8    5      3 
7: 2005-08-01 10:15:20    3    8      3 
8: 2005-08-02 14:10:11    7    0      0 
9: 2005-08-02 14:10:12    6    7      7 
10: 2005-08-02 14:10:13    6    6     -1 
11: 2005-08-02 14:10:14    1    6      0 
12: 2005-08-03 10:00:12    0    0      0 
13: 2005-08-03 10:00:13    1    0      0 
14: 2005-08-03 10:00:14    1    1      1 
15: 2005-08-03 10:00:15    3    1      0 
16: 2005-08-03 10:00:16    3    3      2 
17: 2005-08-03 10:00:17    3    3      0 
+0

パーフェクト、ありがとう! – reallybadstatdude

関連する問題