数値インデックスによってdata.tableの複数の列を選択します


143

数値インデックス(位置)のベクトルを使用して複数の列を選択するにはどうすればよいdata.tableですか?

これは私たちがどうするかですdata.frame

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

回答:


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のNEWS、潜在的に重大な変更、ポイント3 も参照してください。


1
問題ない。またdt[,"a"]、比較して、dt[,"a", with=FALSE]それが本当に役立つオプションを確認してください。
Josh O'Brien

3
これなしでこれを行う方法はありますか?たとえばDT[,list(b:c)、データテーブルの列を直接変換するのが便利だとわかったので(たとえば、できるDT[,list(1/b,2*c)])、これはで機能しません。
ジャンボルタ

2
パッケージへの変更を行いますwith=FALSE。この場合には不要:github.com/Rdatatable/data.table/issues/...
フランク・

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

@トム、この解決策を指摘してくれてありがとう。それは私にとって素晴らしい働きをします。

私は、1つの列を印刷および上記の例から除外する方法を探していました。2番目の列を除外するには、次のようなことができます

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)]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.