要回答你的編輯,只需運行一個標杆:
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::vector
在C++
,每次你用完了時間的兩倍大小空間,如果你不知道開始的數據大小,那麼一旦你完成填充,刪除額外的行)。
對不起,尚未實現。這個答案中的「可能是」和「將會是」意味着將來時。 –
@MthethewDowle嗨。我知道,你的意思是速度(與SQL相比),並說「最後可以插入(並刪除),**即時**」作爲可能性......對不起我的錯。我會改變這個問題,讓它更有意義。 – Michele
任何一個添加這樣的行內DT處理?如下所示: DT [,transformation] [,transformation2] [,transformation3] [,transformation4,by ='abc'] [add_grand_total_summary_row] 很容易將總計放在額外的列中,但它並不那麼優雅。 – jangorecki