要在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对象,这个不再有效。


当前回答

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

删除它们的一个子集:

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

其他回答

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

删除它们的一个子集:

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

你也可以使用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。

DT[,c:=NULL] # remove column c

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

DT$col = NULL

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

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

DT[, col:=NULL]

对于一个数据。如果将列赋值为NULL,则删除该列:

DT[,c("col1", "col1", "col2", "col2")] <- NULL
^
|---- Notice the extra comma if DT is a data.table

... 这相当于:

DT$col1 <- NULL
DT$col2 <- NULL
DT$col3 <- NULL
DT$col4 <- NULL

data.frame的等效函数是:

DF[c("col1", "col1", "col2", "col2")] <- NULL
      ^
      |---- Notice the missing comma if DF is a data.frame

Q.为什么在数据版本中有一个逗号?表,没有逗号的版本为data.frame?

a.由于data.frames是以列列表的形式存储的,你可以跳过逗号。你也可以把它添加进来,但是你需要把它们分配给一个NULL列表,DF[, c("col1", "col2", "col3")] <- list(NULL)。