我的问题是关于引用赋值与在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)
,则为as pointed out here。现在我找到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?
发布于 2014-01-22 02:39:18
为了使内存使用类似于就地删除,我采取的方法是一次设置一列,然后删除。没有一个合适的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 entries
DT.subset = data.table(col1 = DT[['col1']][keep.idxs]) # this is the subsetted table
for (col in cols){
DT.subset[, (col) := DT[[col]][keep.idxs]]
DT[, (col) := NULL] #delete
}
发布于 2016-11-18 16:29:35
这是一个基于@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。在我的笔记本电脑上,从14M行中删除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。因为我是新手,所以我不能在@vc273的帖子中添加评论:-(
发布于 2012-05-29 06:33:18
相反,或者尝试设置为NULL,尝试设置为NA (与第一列的NA-type匹配)
set(DT,1:2, 1:3 ,NA_character_)
https://stackoverflow.com/questions/10790204
复制相似问题