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

jam*_*rta 139 r data.table

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

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

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

Jos*_*ien 182

对于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
Run Code Online (Sandbox Code Playgroud)

对于data.table的 版本< 1.9.8(需要使用数字列选择with = FALSE),请参阅此答案的此前版本.另见新闻,v1.9.8的变化/可能的突发变化/第2点.

  • 有没有办法做到这一点?例如`DT [,list(b:c)`,因为我发现直接在数据表中转换列很方便,例如我可以做`DT [,list(1/b,2*c)]`,但这不适合. (3认同)
  • 在这种情况下,对包的更改将使`with = FALSE`成为不必要的:https://github.com/Rdatatable/data.table/issues/1188#issuecomment-127824969 (2认同)
  • @Valentas有趣的,你应该问。没有使用`with = FALSE`的`data.frame`兼容方式。但是,大约3周前,** data.table **的开发版本已被修改为类似`dt [,2]`,`dt [,2:3]`,`dt [,“ b “]`和`dt [,c(” b“,” c“)]`的行为与使用data.frame`s的行为相同,而无需**显式设置`with = FALSE` 。太棒了![查看此处](https://github.com/Rdatatable/data.table/commit/f78d7901dc5063a5157d37db4831e418ad021fe6)中的特定提交,包括描述更改的NEWS条目。 (2认同)

Tom*_*Tom 42

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

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

这有点麻烦,但你不会失去其他data.table功能(我不认为),所以你仍然可以使用其他重要的功能,如连接表等.

  • 以编程方式创建列列表并不麻烦且非常有用 (6认同)

R Y*_*oda 38

如果要使用列来选择列,只需使用.(),这是以下的别名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
Run Code Online (Sandbox Code Playgroud)


raf*_*ira 17

从v1.10.2开始,你也可以使用 ..

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

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

dt[, ..keep_cols]
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答。我还发现`dt [,!.. keep_cols]`和`dt [,-.. keep_cols]`可以正常工作! (3认同)