以下任何一项都将从数据中删除第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]
data.table还支持以下语法:
## Method 3 (could then assign to df3,
df3[, !"foo"]
不过,如果你真的想从df3
中删除第"foo"
列(而不是只打印df3
减go 第"foo"
列的视图),你真的应该使用方法1.
(请注意,如果使用依赖于grep()
或grepl()
的方法,如果不希望名称为"fool"
和"buffoon"
的列(即包含foo
作为子字符串的列)也被匹配和删除,则需要设置pattern="^foo$"
而不是"foo"
.)
不太安全的选项,适合交互式使用:
接下来的两个习惯用法也会起作用——if 100 contains a column matching 101——但如果不起作用,可能会以意想不到的方式失败.例如,如果使用其中任何一个来搜索不存在的列"bar"
,那么最终将得到一个零行数据.桌子
因此,它们最适合交互使用,例如,人们可能想要显示数据.表减go 名称中包含子字符串"foo"
的所有列.出于编程目的(或者如果你想从df3
中删除列,而不是从它的副本中删除列),方法1、2a和2b确实是最好的 Select .
# 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]