我有一个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常见问题解答和插图,但似乎找不到任何内容。
(我知道这一切都非常简单,我可以选择另外两列。但是,这是一个更大,更大的数据的缩影。我正在使用。)
答案 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以及您所描述的问题,但是在大型数据集上它似乎要慢得多。