以下任何操作都会从 data.table df3 中删除列 foo:
# 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"]
虽然如果您真的想从 df3 中删除列 "foo"(而不是仅打印 df3 减去列 "foo" 的视图),您真的想改用方法 1。
(请注意,如果您使用依赖于grep() 或grepl() 的方法,则需要设置pattern="^foo$" 而不是"foo",如果您不希望列名称为"fool" 和@ 987654335@(即包含foo作为子字符串的那些)也将被匹配和删除。)
不太安全的选项,适合交互使用:
接下来的两个习惯用法也可以使用——如果df3 包含与"foo" 匹配的列——但如果不匹配,则会以一种可能出乎意料的方式失败。例如,如果您使用其中任何一个来搜索不存在的列 "bar",您最终会得到一个零行 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]