web-dev-qa-db-ja.com

data.tableの列のサブセットを選択する

V3という名前の列の1つを除いて、データテーブルdtのすべての列を出力したいのですが、番号ではなく名前で参照したくありません。これは私が持っているコードです:

  dt = data.table(matrix(sample(c(0,1),5,rep=T),50,10))
  dt[,-3,with=FALSE]   #  Is this the only way to not print column "V3"? 

data frameの方法を使用すると、次のコードを使用してこれを行うことができます。

  df = data.frame(matrix(sample(c(0,1),5,rep=T),50,10))
  df[,!(colnames(df)%in% c("X3"))]

だから、私の質問は:番号で参照する必要なしにデータテーブルの1つの列を印刷しない別の方法はありますか?上で使用したデータフレーム構文に似ていますが、データテーブルを使用しているものを見つけたいと思います。

26
nhern121

data.frameの場合と非常によく似た構文を使用しますが、引数with=FALSEを追加します。

dt[, setdiff(colnames(dt),"V9"), with=FALSE]
    V1 V2 V3 V4 V5 V6 V7 V8 V10
 1:  1  1  1  1  1  1  1  1   1
 2:  0  0  0  0  0  0  0  0   0
 3:  1  1  1  1  1  1  1  1   1
 4:  0  0  0  0  0  0  0  0   0
 5:  0  0  0  0  0  0  0  0   0
 6:  1  1  1  1  1  1  1  1   1

with=FALSEの使用については、?data.tablej引数のドキュメントで詳しく説明されています。

j:単一の列名、列名の単一の表現、列名の式のlist()、リストに評価される式または関数呼び出し(data.frameおよびdata.tableを含む)リストでもあります)、または(with=FALSEの場合)[.data.frameのjと同じです。


v1.10.2以降、次のようにこれを行うこともできます。

keep <- setdiff(names(dt), "V9")
dt[, ..keep]

シンボルの前に..を付けると、呼び出しスコープ(つまり、グローバル環境)で検索され、その値は列名または番号( ソース )になります。

37
Andrie

grepを使用して数値に変換し、負の列のインデックスを作成できるようにする方法は次のとおりです。

dt[, -grep("^V3$", names(dt)), with=FALSE]

「V3」は除外されるとおっしゃいましたよね?

14
42-

たぶんそれはdata.tableの最近のバージョン(私は1.9.6を使用しています)にのみありますが、あなたは次のことができます:

dt[, -'V3', with=FALSE]

いくつかの列の場合:

dt[, -c('V3', 'V9'), with=FALSE]

変数名を引用符で囲む必要があることに注意してください。

11
YvanR

バージョン1.12.0以降では、名前に正規表現を使用して列を選択することもできます。

iris_DT <- as.data.table(iris)

iris_DT[, .SD, .SDcols = patterns(".e.al")]
3
der_grund