如何从data.table中排除列?

luk*_*awk 8 r data.table

我有一个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)


akr*_*run 7

我们可以用 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)


raf*_*ira 5

你可以做:

  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)

  • 这不是正确的答案,因为它删除了该列,而不是仅仅排除它。也就是说,当您执行此操作时,“b”和“c”将不再是列。您应该使用 `dt[, setdiff(names(dt), c("b", "c")), with = FALSE]` (4认同)
  • 或者 `dt[ , \`:=\`(b=NULL, c=NULL)]` (3认同)