如何从data.table中排除列?

时间:2016-05-13 12:48:57

标签: 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)]

给我第二和第三栏,b和c。我如何改为排除列b和c。来自data.frame世界,我希望如下:

dt[ , -.(b, c)]

或者,也许

dt[ , !.(b, c)]

但是这些工作还不错。我知道我可以使用

dt[ , -c(2:3), with = FALSE]

但这只是(据我所知)将data.table转换为data.frame,然后使用标准操作。我想避免这种情况,因为它是a)一种作弊,b)放弃data.table中可用的速度提升。我查看了data.table常见问题解答和插图,但似乎找不到任何内容。

(我知道这一切都非常简单,我可以选择另外两列。但是,这是一个更大,更大的数据的缩影。我正在使用。)

6 个答案:

答案 0 :(得分:6)

我们可以使用setdiff

dt[, setdiff(names(dt), c("b", "c")), with = FALSE]

或者我们可以分配到NULL(如在其他答案中)但只需一步

dt[, c("b", "c") := NULL][]

答案 1 :(得分:2)

你可以这样做:

  dt[ , b := NULL][ , c := NULL]

或者您可以使用要删除的列列表:

xx <- c("b","c") # vector of columns you DON'T want

# subset
  dt <- dt[, !xx, with = FALSE]

答案 2 :(得分:1)

此外,如果您不想更改data.table,而只返回除某些列之外的列,则可以执行以下操作:

dt[,.SD, .SDcols = !c('b', 'c')]

返回所需结果:

   a d
1: 1 4
2: 2 5

而dt保持不变:

> dt
   a b c d
1: 1 2 3 4
2: 2 3 4 5

答案 3 :(得分:1)

我正在使用R和data.table包。我正在尝试在c函数中添加希望从data.table对象中排除的列的索引号,并以减号“-”开头。

关于您共享的代码示例,

    dt <- dt[,c(-<index of column "a">, -<index of column "b">)]

注意:“ a列的索引”和“ b列的索引”以及尖括号<和>均应忽略,应将其替换为要排除的列的索引号。 / p>

我个人不建议您使用列索引取消选择列,因为这不是一个好习惯,这是data.table包Arunkumar Srinivasan的合著者在DataCamp课程中告诉您的。在data.table上。

    dt <- dt[,-c(<"name of column to be deselected">, <"name of column deselected">)]

注意:要取消选择的列的名称,而尖括号<和>应该被忽略,应将其替换为要排除的列的名称。

答案 4 :(得分:0)

使用set的另一种方法:

set(dt,, c("b", "c"), NULL)

答案 5 :(得分:0)

您始终可以这样做:

dt[ , -c("b", "c")]

尽管这使用了data.fame sintax以及您所描述的问题,但是在大型数据集上它似乎要慢得多。