2012-08-13 13 views
13

V3という名前の1つを除いて、データテーブルdtのすべての列を印刷したいのですが、数値ではなく名前で参照することは望ましくありません。これは私が持っているコードです:data.tableの列のサブセットの選択

data frame方法を使用して
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"? 

、1はコードを通じてこれを行うことができます:

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

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

+0

[data.table Rの列のサブセットを選択してください](https://stackoverflow.com/questions/28094645/select-subset-of-columns-in-data-table-r) – hhh

+0

@hhhです正しい重複はありません。それは他の方法で閉鎖する必要があります – Jaap

+0

@ジャップ私は知っているが、新しい質問スレッドの品質が良いので、私は別の方法で投票した。 – hhh

答えて

26

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()、式または関数呼び出しt (data.framedata.tableもリストである)またはのjと同じ(with=FALSEの場合)と評価されます。


次のようにこれを行うことも可能である以降v1.10.2向けから:..と記号を前置

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

は(地球環境IE)のスコープを呼んで調べますと、その値は列名または数値(source)になります。ここで

9

は、数値に変換し、負の列のインデックスを許可するようにgrepを使用する方法です:

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

あなたは右、「V3」は除外されることになっていたと言ったのですか?

+0

はい。私は「V3」を除外したかったのです。ありがとう! – Nestorghh

+0

複数の列を除外したい場合はどうすればこの方法が使えますか?@DWin – Nestorghh

+2

regex-grepで条件を追加するのはとても簡単です。 OR記号 "|"だけを使用してください。 'dt [、-grep("^V3 $ |^V9 $ "、名前(dt)、= FALSE' –

7

多分それは(私は1.9.6を使用しています)のみdata.tableの最近のバージョンではありますが、あなたは行うことができます。

いくつかの列の場合
dt[, -'V3', with=FALSE] 

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

に留意されたいです。変数名を引用符で囲む必要があります。

関連する問題