2013-05-28 71 views
32

在此question程序包創建者data.table尚未解釋爲什麼行不能通過引用插入(或刪除)。他還指出,這種行動可能會在表格末尾出現。你能展示一個代碼來執行這個動作嗎?這將是「參考」版本在data.table對象的末尾添加一行引用行

a<- data.table(id=letters[1:2], var=1:2) 
> a 
    id var 
1: a 1 
2: b 2 
> rbind(a, data.table(id="c", var=3)) 
    id var 
1: a 1 
2: b 2 
3: c 3 

謝謝。

編輯:

因爲適當的解決方案是不可能的是,其下面的是更好的(如果內部不同,不知道)或者從一個速度和內存使用角度探討?

rbind(a, data.table(id="c", var=3)) 

rbindlist(list(a, data.table(id="c", var=3))) 

最終還有其他(更好的)方法嗎?

+4

對不起,尚未實現。這個答案中的「可能是」和「將會是」意味着將來時。 –

+0

@MthethewDowle嗨。我知道,你的意思是速度(與SQL相比),並說「最後可以插入(並刪除),**即時**」作爲可能性......對不起我的錯。我會改變這個問題,讓它更有意義。 – Michele

+0

任何一個添加這樣的行內DT處理?如下所示: DT [,transformation] [,transformation2] [,transformation3] [,transformation4,by ='abc'] [add_grand_total_summary_row] 很容易將總計放在額外的列中,但它並不那麼優雅。 – jangorecki

回答

18

要回答你的編輯,只需運行一個標杆:

a = data.table(id=letters[1:2], var=1:2) 
b = copy(a) 
c = copy(b) # let's also just try modifying same value in place 
      # to see how well changing existing values does 
microbenchmark(a <- rbind(a, data.table(id="c", var=3)), 
       b <- rbindlist(list(b, data.table(id="c", var=3))), 
       c[1, var := 3L], 
       set(c, 1L, 2L, 3L)) 
#Unit: microseconds 
#             expr  min  lq median  uq  max neval 
#   a <- rbind(a, data.table(id = "c", var = 3)) 865.460 1141.2585 1357.1230 1539.4300 6814.492 100 
#b <- rbindlist(list(b, data.table(id = "c", var = 3))) 260.440 325.3835 445.4190 522.8825 1143.930 100 
#         c[1, `:=`(var, 3L)] 482.147 626.5570 778.3135 904.3595 1109.539 100 
#                                  set(c, 1L, 2L, 3L)   2.339    5.677    7.5140    9.5170   19.033   100 

rbindlist顯然比rbind更好。感謝Matthew Dowle指出在循環中使用[時遇到的問題,我用set添加了另一個基準。

從上面的您的最佳選擇是使用rbindlist,或施膠data.table開始用,然後就填充值(你也可以使用類似的策略來std::vectorC++,每次你用完了時間的兩倍大小空間,如果你不知道開始的數據大小,那麼一旦你完成填充,刪除額外的行)。

+3

不錯。令人驚訝的是,這可能是多次調用'[.data.table''的開銷,因爲'microbenchmark'在這個例子中調用了100次。嘗試使用'set()'來代替循環的':='。 –

+0

,如果你將'id'設置爲'c'的鍵值,並且你在'c [「a」,var:= 3L]中改變了'c [1,var:= 3L]',這個速度就更慢了,第一。無論如何,非常感謝。我可以自己完成我知道的事情,但我對'data.table'更新,並且我想從問題中獲得最大的收益(例如,我不知道「copy」!) – Michele

+0

@Matthew Dowle 25%更快然後'rbindlist' – Michele

相關問題