web-dev-qa-db-ja.com

data.tableでプログラムで列を選択する方法は?

私は次のdata.table(DT)を持っています:

DT <- data.table(V1 = 1:3, V2 = 4:6, V3 = 7:9)

関連する変数名が格納されているオブジェクトを使用して、プログラムで(動的に)変数のサブセットを選択したいと思います。たとえば、変数「keep」に格納されている2つの列「V1」と「V3」を選択したいとします。

keep <- c("V1", "V3")

Data.frameから「keep」列を選択すると、次のように機能します。

DT[keep]

残念ながら、これがdata.tableの場合、これは機能しません。 data.frameとdata.tableはこの種の動作と同じだと思いましたが、明らかにそうではありません。正しい構文についてアドバイスできる人はいますか?

15
Jochem

これについては FAQ 1.1、1.2、2.17 で説明されています。

いくつかの可能性:

_DT[, keep, with = FALSE]
DT[, c('V1', 'V3'), with = FALSE]
DT[, c(1, 3), with = FALSE]
DT[, list(V1, V3)]
_

DF[c('V1','V3')]が_data.frame_の場合と同じように機能する理由は、_?`[.data.frame`_で説明されています。

データフレームには、いくつかのモードでインデックスを付けることができます。 _[_および_[[_が単一のベクトルインデックス(_x[i]_または_x[[i]]_)で使用される場合、それらはデータフレームをリストであるかのようにインデックス付けします。この使用法では、drop引数は無視され、警告が表示されます。


_data.table 1.10.2_ から、プログラムで列をサブセット化するときに_.._プレフィックスを使用できます。

jが_.._で始まるシンボルである場合、それは呼び出しスコープで検索され、その値は列名または数値と見なされます[...]これは実験的なものです。

したがって:

_DT[ , ..keep]
#    V1 V3
# 1:  1  7
# 2:  2  8
# 3:  3  9
_
23
mnel