32

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

  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つの列を番号で参照する必要なしに印刷しない別の方法はありますか?上で使用したデータフレーム構文に似ていますが、データテーブルを使用しているものを見つけたいと思います。

4

5 に答える 5

48

と非常によく似た構文を使用します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のドキュメントでうまく説明されています。j?data.table

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


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

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

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

于 2012-08-13T19:09:20.830 に答える
14

より現代的なアプローチで2019-09-27を編集する

patterns上記のようにこれを行うことができます。または、!名前のベクトルがすでにある場合は、それを行うことができます。

dt[ , !'V3']
# or
drop_cols = 'V3'
dt[ , !..drop_cols]

..「1つのレベルを調べる」という意味です


を使用した古いバージョンwith=FALSEdata.tableこの議論から着実に離れています)

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

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

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

于 2012-08-13T19:30:30.627 に答える
13

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

dt[, -'V3']

いくつかの列の場合:

dt[, -c('V3', 'V9')]

変数名を引用符で囲む必要があることに注意してください。また、列名が変数に格納されている場合、たとえばcols、を実行する必要がありますdt[, -cols, with=FALSE]

于 2016-02-11T22:25:23.260 に答える
5

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

iris_DT <- as.data.table(iris)

iris_DT[, .SD, .SDcols = patterns(".e.al")]
于 2019-01-17T07:23:00.907 に答える
-1

この質問への回答を要約し、
a)否定に適したもの(否定によって列を選択できるようにするため)、
b)パイプラインに適したもの(%>%演算子を使用してパイプラインで使用できるようにするため) )、および
c)列番号と列名の両方を使用して選択できるように、これらは使用可能なオプションです。

library(data.table);

select1 <- function (dt, range)  dt[, range, with=F]
select2 <- function (dt, range)  dt[, ..range]
select3 <- function (dt, range)  dt[, .SD, .SDcols=range] 

dt <- ggplot2::diamonds

range <- 1:3 # or 
range <- dt %>% names %>% .[1:3]

dt %>% select1(range);
dt %>% select2(range); 
dt %>% select3(range); 

dt %>% select1(-range);
dt %>% select2(-range); 
dt %>% select3(-range); # DOES NOT WORK

Also we note that this
dt %>% .[, ..(names(dt)[1:3])] # DOES NOT WORK

したがって、で複数の列を選択するための最良の(最も普遍的で高速な)方法data.tableは次のとおりです。

# columns are selected using column numbers:
range <- 1:3
dt %>% select1(range); 
dt %>% .[, range, with=F]

# The same works if columns are selected using column names:
range <- names(dt) [1:3]
dt %>% select1(range); 
dt %>% .[, range, with=F]

PS。複数の列を選択する代わりに、参照によってdata.tableから複数の列を効率的に削除する場合(つまり、data.table全体をコピーする代わりに)、data.tableの:=演算子を使用できます。しかし、1行の複数の列に対してそれを行う方法がわかりません

于 2021-12-04T17:10:34.127 に答える