1. ホーム
  2. r

[解決済み】data.tableで名前を指定してカラムを削除する方法は?

2022-04-06 07:23:38

質問

の中の "foo"という名前のカラムを削除するには、次のようにします。 data.frame ,できる。

df <- df[-grep('foo', colnames(df))]

しかし、一旦 df が変換され data.table オブジェクトを使用する場合、カラムを削除することはできません。

df <- data.frame(id = 1:100, foo = rnorm(100))
df2 <- df[-grep('foo', colnames(df))] # works
df3 <- data.table(df)
df3[-grep('foo', colnames(df3))] 

しかし、一度変換されたものを data.table オブジェクトを使用する場合、これはもう機能しません。

解決方法は?

以下のいずれかを実行すると、カラムが削除されます。 foo をdata.tableから削除します。 df3 :

# Method 1 (and preferred as it takes 0.00s even on a 20GB data.table)
df3[,foo:=NULL]

df3[, c("foo","bar"):=NULL]  # remove two columns

myVar = "foo"
df3[, (myVar):=NULL]   # lookup myVar contents

# Method 2a -- A safe idiom for excluding (possibly multiple)
# columns matching a regex
df3[, grep("^foo$", colnames(df3)):=NULL]

# Method 2b -- An alternative to 2a, also "safe" in the sense described below
df3[, which(grepl("^foo$", colnames(df3))):=NULL]

data.table は、以下の構文もサポートしています。

## Method 3 (could then assign to df3, 
df3[, !"foo"]  

しかし、実際にカラムを削除したいのであれば "foo" から df3 (のビューを印刷するだけでなく)。 df3 マイナス列 "foo" ) の場合、代わりに方法1を使用することを強くお勧めします。

(に依存するメソッドを使用する場合はご注意ください。 grep() または grepl() を設定する必要があります。 pattern="^foo$" ではなく "foo" のような名前のカラムが必要ない場合は、そのカラムを使用します。 "fool""buffoon" (を含むもの foo もマッチングされ、削除されます)。

安全性の低いオプション、インタラクティブな使用には問題ありません。

次の2つのイディオムも動作します。 もし df3 にマッチするカラムが含まれています。 "foo" -- しかし、そうでない場合は、おそらく予期しない方法で失敗します。例えば、これらのカラムのいずれかを使って、存在しないカラムである "bar" となると、0行のdata.tableになってしまいます。

その結果、これらはインタラクティブな使用に最も適しており、例えば、data.tableから、部分文字列 "foo" . プログラミングの目的で(あるいは、実際に df3 のコピーではなく)、方法1、2a、2bが本当に最良の選択肢です。

# Method 4:
df3[, .SD, .SDcols = !patterns("^foo$")]


最後に with=FALSE しかし data.table は、この引数を使用しない方向へ徐々に進んでいるため、避けられる場合は避けるようになりました。

# Method 5a (like Method 3)
df3[, !"foo", with=FALSE] 
# Method 5b (like Method 4)
df3[, !grep("^foo$", names(df3)), with=FALSE]
# Method 5b (another like Method 4)
df3[, !grepl("^foo$", names(df3)), with=FALSE]