我的问题与通过引用进行分配而不是在中进行复制有关data.table
。我想知道是否可以通过引用删除行,类似于
DT[ , someCol := NULL]
我想知道
DT[someRow := NULL, ]
我猜这是为什么没有此功能的充分原因,因此也许您可以指出一个替代常规复制方法的好方法,如下所示。特别要注意的是,我喜欢example(data.table)中的内容,
DT = data.table(x = rep(c("a", "b", "c"), each = 3), y = c(1, 3, 6), v = 1:9)
# x y v
# [1,] a 1 1
# [2,] a 3 2
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 9
假设我要从此data.table中删除第一行。我知道我可以这样做:
DT <- DT[-1, ]
但通常我们可能要避免这种情况,因为我们正在复制对象(这需要大约3 * N的内存(如果为N object.size(DT)
,如此处所指出的那样。)。现在我发现了set(DT, i, j, value)
。第1行和第2行以及第2和3列的值都为零)
set(DT, 1:2, 2:3, 0)
DT
# x y v
# [1,] a 0 0
# [2,] a 0 0
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 9
但是,如何删除前两行呢?在做
set(DT, 1:2, 1:3, NULL)
将整个DT设置为NULL。
我的SQL知识非常有限,所以你们告诉我:给定data.table使用SQL技术,是否有等效于SQL命令的信息
DELETE FROM table_name
WHERE some_column=some_value
在data.table中?
DT[ , keep := .I > 1]
,然后是子集以用于以后的操作:DT[(keep), ...]
甚至setindex(DT, keep)
该子集的速度。不是万能的,但值得在工作流程中考虑作为设计选择-您是否真的要从内存中删除所有这些行,还是希望排除它们?答案因用例而异。
data.table()
使用SQL技术是如此之多,以至于人们可以在SQL的不同操作与data.table
。对我而言,对“技术”的引用在某种程度上意味着它data.table
位于某个地方的SQL数据库的顶部,而AFAIK并非如此。