2016-07-09 44 views
7

最後一排這是我的數據表如下所示:獲取一前一組的data.table

library(data.table) 
dt <- fread(' 
    Product Group LastProductOfPriorGroup 
    A   1   NA 
    B   1   NA 
    C   2   B 
    D   2   B 
    E   2   B 
    F   3   E 
    G   3   E 
') 

LastProductOfPriorGroup列是我所需的列。我試圖從上一組的最後一行獲取產品。所以在前兩行中,沒有先前的組,因此它是NA。在第三行中,前一組的最後一行中的產品是B。我試圖通過

dt[,LastGroupProduct:= shift(Product,1), by=shift(Group,1)] 

無濟於事。

回答

14

你可以做

dt[, newcol := shift(dt[, last(Product), by = Group]$V1)[.GRP], by = Group] 

這將導致以下更新dt,其中newcol您所需的列與不必要的長名稱相匹配。 ;)

Product Group LastProductOfPriorGroup newcol 
1:  A  1      NA  NA 
2:  B  1      NA  NA 
3:  C  2      B  B 
4:  D  2      B  B 
5:  E  2      B  B 
6:  F  3      E  E 
7:  G  3      E  E 

讓我們從裏到外打破代碼。我將使用...表示累計的代碼:

  • dt[, last(Product), by = Group]$V1從每個組爲一個字符向量得到最後值。
  • shift(...)
  • dt[, newcol := ...[.GRP], by = Group]組由Group轉移在一個呼叫的特徵向量,並使用內部.GRP值索引

更新:弗蘭克帶來了我的代碼的好點以上計算的轉變爲每一個團隊一次又一次。爲了避免這種情況,我們可以使用

shifted <- shift(dt[, last(Product), Group]$V1) 
dt[, newcol := shifted[.GRP], by = Group] 

,使我們不計算每個羣組的移位。或者,我們可以在評論中採納弗蘭克的好建議,並執行以下操作。

dt[dt[, last(Product), by = Group][, v := shift(V1)], on="Group", newcol := i.v] 
+0

您正在使用=組2次。第一個和第二個相比,是什麼? $ V1的意義是什麼? – gibbz00

+1

@ gibbz00 - 我添加了一些解釋。希望能幫助到你。 –

+1

您正在爲每個組計算'shift(dt [,last(Product),by = Group] $ V1)'。我可能會做'dt [dt [,last(Product),by = Group] [,v:= shift(V1)],on =「Group」,newcol:= iv]' – Frank

7

另一種方法是保存在變量最後一組的值。

this = NA_character_ # initialize 
dt[, LastProductOfPriorGroup:={ last<-this; this<-last(Product); last }, by=Group] 
dt 
    Product Group LastProductOfPriorGroup 
1:  A  1      NA 
2:  B  1      NA 
3:  C  2      B 
4:  D  2      B 
5:  E  2      B 
6:  F  3      E 
7:  G  3      E 

NB:last()data.table函數返回(在這種情況下,產品塔)的向量的最後一個項目。

這應該也很快,因爲沒有邏輯被調用來獲取最後一組的值;它只依賴於按順序運行的組(他們這樣做)。