如何在data.table中按引用删除行?

如何在data.table中按引用删除行?

我的问题与引用分配和复制分配有关data.table。我想知道是否可以通过引用删除行,类似于


DT[ , someCol := NULL]

我想知道


DT[someRow := NULL, ]

我想有一个很好的理由说明为什么这个功能不存在,所以也许你可以指出一个很好的替代通常的复制方法,如下所示。特别是,从我的例子(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)。我知道如何设置特定值(如下所示:set all第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?


扬帆大鱼
浏览 790回答 3
3回答

慕容3067478

我为使内存使用而采取的方法类似于就地删除是一次对列进行子集并删除。没有正确的C memmove解决方案快,但内存使用是我在这里所关心的。这样的事情:DT&nbsp;=&nbsp;data.table(col1&nbsp;=&nbsp;1:1e6)cols&nbsp;=&nbsp;paste0('col',&nbsp;2:100)for&nbsp;(col&nbsp;in&nbsp;cols){&nbsp;DT[,&nbsp;(col)&nbsp;:=&nbsp;1:1e6]&nbsp;}keep.idxs&nbsp;=&nbsp;sample(1e6,&nbsp;9e5,&nbsp;FALSE)&nbsp;#&nbsp;keep&nbsp;90%&nbsp;of&nbsp;entriesDT.subset&nbsp;=&nbsp;data.table(col1&nbsp;=&nbsp;DT[['col1']][keep.idxs])&nbsp;#&nbsp;this&nbsp;is&nbsp;the&nbsp;subsetted&nbsp;tablefor&nbsp;(col&nbsp;in&nbsp;cols){ &nbsp;&nbsp;DT.subset[,&nbsp;(col)&nbsp;:=&nbsp;DT[[col]][keep.idxs]] &nbsp;&nbsp;DT[,&nbsp;(col)&nbsp;:=&nbsp;NULL]&nbsp;#delete}

千巷猫影

这是一个基于@ vc273的答案和@Frank的反馈的工作函数。delete&nbsp;<-&nbsp;function(DT,&nbsp;del.idxs)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;pls&nbsp;note&nbsp;'del.idxs'&nbsp;vs.&nbsp;'keep.idxs' &nbsp;&nbsp;keep.idxs&nbsp;<-&nbsp;setdiff(DT[,&nbsp;.I],&nbsp;del.idxs);&nbsp;&nbsp;#&nbsp;select&nbsp;row&nbsp;indexes&nbsp;to&nbsp;keep &nbsp;&nbsp;cols&nbsp;=&nbsp;names(DT); &nbsp;&nbsp;DT.subset&nbsp;<-&nbsp;data.table(DT[[1]][keep.idxs]);&nbsp;#&nbsp;this&nbsp;is&nbsp;the&nbsp;subsetted&nbsp;table &nbsp;&nbsp;setnames(DT.subset,&nbsp;cols[1]); &nbsp;&nbsp;for&nbsp;(col&nbsp;in&nbsp;cols[2:length(cols)])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;DT.subset[,&nbsp;(col)&nbsp;:=&nbsp;DT[[col]][keep.idxs]]; &nbsp;&nbsp;&nbsp;&nbsp;DT[,&nbsp;(col)&nbsp;:=&nbsp;NULL];&nbsp;&nbsp;#&nbsp;delete &nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;return(DT.subset);}其用法示例:dat&nbsp;<-&nbsp;delete(dat,del.idxs)&nbsp;&nbsp;&nbsp;##&nbsp;Pls&nbsp;note&nbsp;'del.idxs'&nbsp;instead&nbsp;of&nbsp;'keep.idxs'其中“dat”是data.table。从我的笔记本电脑上删除1.4M行中的14k行需要0.25秒。>&nbsp;dim(dat)[1]&nbsp;1419393&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;25>&nbsp;system.time(dat&nbsp;<-&nbsp;delete(dat,del.idxs)) &nbsp;&nbsp;&nbsp;user&nbsp;&nbsp;system&nbsp;elapsed&nbsp; &nbsp;&nbsp;&nbsp;0.23&nbsp;&nbsp;&nbsp;&nbsp;0.02&nbsp;&nbsp;&nbsp;&nbsp;0.25&nbsp;>&nbsp;dim(dat)[1]&nbsp;1404715&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;25>PS。由于我是SO的新手,我无法在@ vc273的帖子中添加评论:-(
打开App,查看更多内容
随时随地看视频慕课网APP