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つの列を印刷しない別の方法はありますか?上で使用したデータフレーム構文に似ていますが、データテーブルを使用しているものを見つけたいと思います。
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.table
のj
引数のドキュメントで詳しく説明されています。
j:単一の列名、列名の単一の表現、列名の式のlist()
、リストに評価される式または関数呼び出し(data.frame
およびdata.table
を含む)リストでもあります)、または(with=FALSE
の場合)[.data.frame
のjと同じです。
v1.10.2以降、次のようにこれを行うこともできます。
keep <- setdiff(names(dt), "V9")
dt[, ..keep]
シンボルの前に..
を付けると、呼び出しスコープ(つまり、グローバル環境)で検索され、その値は列名または番号( ソース )になります。
grep
を使用して数値に変換し、負の列のインデックスを作成できるようにする方法は次のとおりです。
dt[, -grep("^V3$", names(dt)), with=FALSE]
「V3」は除外されるとおっしゃいましたよね?
たぶんそれはdata.tableの最近のバージョン(私は1.9.6を使用しています)にのみありますが、あなたは次のことができます:
dt[, -'V3', with=FALSE]
いくつかの列の場合:
dt[, -c('V3', 'V9'), with=FALSE]
変数名を引用符で囲む必要があることに注意してください。
バージョン1.12.0以降では、名前に正規表現を使用して列を選択することもできます。
iris_DT <- as.data.table(iris)
iris_DT[, .SD, .SDcols = patterns(".e.al")]