通过其数字索引选择data.table中的多个列


143

如何使用中的数字索引(位置)向量选择多列data.table

这就是我们如何处理data.frame

df <- data.frame(a = 1, b = 2, c = 3)
df[ , 2:3]
#   b c
# 1 2 3

Answers:


185

对于data.table的 版本>= 1.9.8,以下所有方法均适用:

library(data.table)
dt <- data.table(a = 1, b = 2, c = 3)

# select single column by index
dt[, 2]
#    b
# 1: 2

# select multiple columns by index
dt[, 2:3]
#    b c
# 1: 2 3

# select single column by name
dt[, "a"]
#    a
# 1: 1

# select multiple columns by name
dt[, c("a", "b")]
#    a b
# 1: 1 2

对于data.table 版本< 1.9.8(需要使用来选择数字列with = FALSE),请参见此答案的先前版本。另请参阅v1.9.8的新闻,可能的更改,第3点。


1
没问题。还比较dt[,"a"]dt[,"a", with=FALSE]看看它到底是怎样一个有用的选项。
乔什·奥布莱恩

3
有没有办法做到这一点?例如DT[,list(b:c),由于我发现直接在数据表中转换列很方便(例如,我可以这样做)DT[,list(1/b,2*c)],但这不适用于。
jamborta 2012年

2
with=FALSE在这种情况下,无需更改软件包:github.com/Rdatatable/data.table/issues/…–
Frank

1
@弗兰克-真是个好消息!感谢您引起我的注意。一旦该更改进入CRAN上分发的data.table版本中,我将编辑此答案以宣布更改。(而且,请您-您或其他阅读此书的人-在发生这种情况后立即向我发出提醒消息。)
Josh O'Brien

2
@Valentas有趣的,你应该问。没有data.frame兼容的使用方式with=FALSE。然而,由于大约3个星期前,开发版本data.table已被修改成类似电话dt[, 2]dt[, 2:3]dt[, "b"],并dt[, c("b", "c")]为他们在做相同的行为data.frame小号有明确设置with=FALSE。太棒了!有关特定提交,请参见此处,包括描述更改的NEWS条目。
乔什·奥布莱恩

43

这有点冗长,但是我已经习惯了使用隐藏.SD变量。

b<-data.table(a=1,b=2,c=3,d=4)
b[,.SD,.SDcols=c(1:2)]

这有点麻烦,但是您不会在其他data.table功能上迷失自我(我不认为),因此您仍然应该能够使用其他重要功能,例如联接表等。


6
以编程方式创建列列表时并不麻烦,而且非常有用
Chris

39

如果要使用列来选择列,只需使用.(),这是别名list()

library(data.table)
dt <- data.table(a = 1:2, b = 2:3, c = 3:4)
dt[ , .(b, c)] # select the columns b and c
# Result:
#    b c
# 1: 2 3
# 2: 3 4

19

从v1.10.2开始,您还可以使用 ..

dt <- data.table(a=1:2, b=2:3, c=3:4)

keep_cols = c("a", "c")

dt[, ..keep_cols]

3
感谢您的回答。我也发现了这一点,dt[, !..keep_cols]并且 dt[, -..keep_cols] 按预期工作!
IceCreamToucan

3

@Tom,非常感谢您指出此解决方案。这对我很有效。

我正在寻找一种方法,仅从打印内容和上面的示例中排除一​​列。要排除第二列,您可以执行以下操作

library(data.table)
dt <- data.table(a=1:2, b=2:3, c=3:4)
dt[,.SD,.SDcols=-2]
dt[,.SD,.SDcols=c(1,3)]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.