要在data.frame中删除名为“foo”的列,我可以这样做:

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

然而,一旦df被转换为数据。表对象时,没有办法直接删除列。

例子:

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))] 

但是一旦它被转换成数据。Table对象,这个不再有效。


当前回答

你也可以使用set,这样可以避免使用[.data]的开销。循环表:

dt <- data.table( a=letters, b=LETTERS, c=seq(26), d=letters, e=letters )
set( dt, j=c(1L,3L,5L), value=NULL )
> dt[1:5]
   b d
1: A a
2: B b
3: C c
4: D d
5: E e

如果你想通过列名来做,(colnames(dt) %in% c("a","c","e"))应该适用于j。

其他回答

下面是一种方法,当您想要将#列设置为给定列名的NULL时 一个供您使用的函数:)

deleteColsFromDataTable <- function (train, toDeleteColNames) {

       for (myNm in toDeleteColNames)

       train <- train [,(myNm):=NULL]

       return (train)
}

假设dt有col1 col2 col3 col4 col5, col1。

删除它们的一个子集:

vx <- as.character(bquote(c(col1, col2, col3, coln)))[-1]
DT[, paste0(vx):=NULL]

以下任何操作都将从数据中删除列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]

非常简单的选项,如果你在一个数据表中有很多单独的列要删除,你想避免输入所有的列名# careadvise

dt <- dt[, -c(1,4,6,17,83,104)]

这将根据列号删除列。

它显然没有那么高效,因为它绕过了数据。表的优势,但如果你处理的行少于50万行,它也可以工作

我只是用数据帧的方式来做

DT$col = NULL

效果很快,而且据我所知,没有引起任何问题。

UPDATE:如果你的DT非常大,这不是最好的方法,因为使用$<-操作符会导致对象复制。所以更好的使用:

DT[, col:=NULL]