Mic*_*ele 39 r data.table
在这个问题中,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
Run Code Online (Sandbox Code Playgroud)
谢谢.
编辑:
既然不可能采用适当的解决方案,那么从速度和内存使用情况来看,下列哪一项更好(如果内部不同,不确定)?
rbind(a, data.table(id="c", var=3))
rbindlist(list(a, data.table(id="c", var=3)))
Run Code Online (Sandbox Code Playgroud)
最终还有其他(更好)的方法吗?
edd*_*ddi 22
要回答您的编辑,只需运行基准测试:
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
Run Code Online (Sandbox Code Playgroud)
rbindlist
显然比rbind
.感谢Matthew Dowle指出[
在循环中使用的问题,我添加了另一个基准set
.
从上面的你最好的选择是使用rbindlist
,或施胶data.table
开始用,然后就填充值(你也可以使用类似的策略std::vector
中C++
,双击大小每次运行的空间,如果你不知道要开始的数据大小,然后一旦填写完毕,删除额外的行).