如何在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_nameWHERE some_column=some_value在data.table?
3 回答
慕容3067478
TA贡献1773条经验 获得超3个赞
我为使内存使用而采取的方法类似于就地删除是一次对列进行子集并删除。没有正确的C memmove解决方案快,但内存使用是我在这里所关心的。这样的事情:
DT = data.table(col1 = 1:1e6)cols = paste0('col', 2:100)for (col in cols){ DT[, (col) := 1:1e6] }keep.idxs = sample(1e6, 9e5, FALSE) # keep 90% of entriesDT.subset = data.table(col1 = DT[['col1']][keep.idxs]) # this is the subsetted tablefor (col in cols){ DT.subset[, (col) := DT[[col]][keep.idxs]] DT[, (col) := NULL] #delete}
千巷猫影
TA贡献1829条经验 获得超7个赞
这是一个基于@ vc273的答案和@Frank的反馈的工作函数。
delete <- function(DT, del.idxs) { # pls note 'del.idxs' vs. 'keep.idxs' keep.idxs <- setdiff(DT[, .I], del.idxs); # select row indexes to keep cols = names(DT); DT.subset <- data.table(DT[[1]][keep.idxs]); # this is the subsetted table setnames(DT.subset, cols[1]); for (col in cols[2:length(cols)]) { DT.subset[, (col) := DT[[col]][keep.idxs]]; DT[, (col) := NULL]; # delete } return(DT.subset);}
其用法示例:
dat <- delete(dat,del.idxs) ## Pls note 'del.idxs' instead of 'keep.idxs'
其中“dat”是data.table。从我的笔记本电脑上删除1.4M行中的14k行需要0.25秒。
> dim(dat)[1] 1419393 25> system.time(dat <- delete(dat,del.idxs)) user system elapsed 0.23 0.02 0.25 > dim(dat)[1] 1404715 25>
PS。由于我是SO的新手,我无法在@ vc273的帖子中添加评论:-(
- 3 回答
- 0 关注
- 824 浏览
添加回答
举报
0/150
提交
取消