以下任何操作都将从数据中删除列foo。表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]
数据。Table还支持以下语法:
## Method 3 (could then assign to df3,
df3[, !"foo"]
虽然如果你真的想从df3中删除列“foo”(而不是仅仅打印df3减去列“foo”的视图),你真的想使用方法1来代替。
(请注意,如果你使用一个依赖于grep()或grepl()的方法,你需要设置pattern="^foo$"而不是"foo",如果你不想让像"fool"和"buffoon"这样的列(即那些包含foo作为子字符串的列)也被匹配和删除。)
不太安全的选项,适合交互使用:
如果df3包含匹配“foo”的列,那么接下来的两个习惯用法也可以工作,但是如果不这样做,则可能会以一种意想不到的方式失败。例如,如果您使用它们中的任何一个来搜索不存在的列“bar”,那么您将得到一个零行的data.table。
因此,它们确实最适合交互使用,例如,想要显示数据。表减去名称包含子字符串“foo”的任何列。出于编程目的(或者如果您想从df3而不是从df3的副本中删除列),方法1、2a和2b实际上是最佳选择。
# Method 4:
df3[, .SD, .SDcols = !patterns("^foo$")]
最后,还有一些方法使用with=FALSE,尽管数据。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]