我有一个data.table,并希望排除一些列.例如,
library(data.table)
dt <- data.table(a = 1:2, b = 2:3, c = 3:4, d = 4:5)
dt[ , .(b, c)]
Run Code Online (Sandbox Code Playgroud)
给我第二和第三列,b和c.我如何改为排除列b和c.来自data.frame世界,我希望如下:
dt[ , -.(b, c)]
Run Code Online (Sandbox Code Playgroud)
或者可能
dt[ , !.(b, c)]
Run Code Online (Sandbox Code Playgroud)
但是这些工作还不错.我知道我可以使用
dt[ , -c(2:3), with = FALSE]
Run Code Online (Sandbox Code Playgroud)
但这只是(据我所知)将data.table转换为data.frame,然后使用标准操作.我想避免这种情况,因为它是a)一种作弊,b)放弃data.table中可用的速度提升.我查看了data.table常见问题解答和插图,似乎找不到任何东西.
(我知道这一切都非常简单,我可以选择另外两列.但是,这是一个更大,更大的数据的缩影.我正在使用.)
ira*_*ira 16
此外,如果您不想更改 data.table,而只想返回除某些列之外的列,您可以执行以下操作:
dt[,.SD, .SDcols = !c('b', 'c')]
Run Code Online (Sandbox Code Playgroud)
它返回所需的结果:
a d
1: 1 4
2: 2 5
Run Code Online (Sandbox Code Playgroud)
而 dt 保持不变:
> dt
a b c d
1: 1 2 3 4
2: 2 3 4 5
Run Code Online (Sandbox Code Playgroud)
我们可以用 setdiff
dt[, setdiff(names(dt), c("b", "c")), with = FALSE]
Run Code Online (Sandbox Code Playgroud)
或者我们可以分配给NULL(如在另一个答案中),但只需一步
dt[, c("b", "c") := NULL][]
Run Code Online (Sandbox Code Playgroud)
你可以做:
dt[ , b := NULL][ , c := NULL]
Run Code Online (Sandbox Code Playgroud)
或者您可以使用要删除的列的列表:
xx <- c("b","c") # vector of columns you DON'T want
# subset
dt <- dt[, !xx, with = FALSE]
Run Code Online (Sandbox Code Playgroud)