44

在这个问题中,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

1 回答 1

26

要回答您的编辑,只需运行基准测试:

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::vectorin类似的策略C++,并且每次空间不足时将大小加倍数据的大小开始,然后一旦你完成填写,删除额外的行)。

于 2013-05-28T16:49:51.640 回答