如何通过data.table中的名称删除列?

为了摆脱data.frame名为“foo”的data.frame ,我可以这样做:

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

但是,一旦df被转换为data.table对象,就没有办法只删除一列。

例:

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

但是,一旦它被转换成data.table对象,这不再起作用。

以下任何一项都会从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", with=FALSE] 

但如果你真的想从df3删除列"foo" (相对于只打印df3减去列"foo"的视图),你真的想要使用方法1。

(请注意,如果您使用依赖于grep()grepl() ,则需要设置pattern="^foo$"而不是"foo" ,如果不想使用"fool" "buffoon" (即包含foo作为子string的那些)也被匹配和删除。)

不太安全的选项,适合交互使用:

接下来的两个成语也会起作用 – 如果df3包含一个匹配"foo"的列 – 但是如果没有,可能以意想不到的方式失败。 例如,如果使用其中的任何一个来search不存在的列"bar" ,那么最终将得到一个零行data.table。

因此,它们最适合于交互式使用,例如,想要显示一个data.table减去任何含有子string"foo"名称的列。 为了编程的目的(或者如果你想从df3而不是从副本中删除列),方法1,2a和2b确实是最好的select。

 # Method 4a: df3[, -grep("^foo$", colnames(df3)), with=FALSE] # Method 4b: df3[, !grepl("^foo$", colnames(df3)), with=FALSE] 

你也可以为用户set这个,这样可以避免[.data.table在循环中的开销:

 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] bd 1: A a 2: B b 3: C c 4: D d 5: E e 

如果你想通过列名来完成,那么对于jwhich(colnames(dt) %in% c("a","c","e"))应该工作。

我只是在数据框中这样做:

 DT$col = NULL 

工作很快,据我所知,不会造成任何问题。

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

 DT[, col:=NULL] 

非常简单的选项,以防您在数据表中删除多个单独的列,并且希望避免input所有列名称#careadviced

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

这将根据列号删除列。

这显然不是有效的,因为它绕过data.table优势,但如果你正在使用less于500,000行,它工作正常

假设你的dt有列col1col2col3col4col5coln

要删除它们的一个子集:

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

这里有一种方法,当你想设置列的列数为NULL,因为它们的列名是你的用法:)

deleteColsFromDataTable < – 函数(train,toDeleteColNames){

  for (myNm in toDeleteColNames) train <- train [,(myNm):=NULL,with=F] return (train) 

}

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

对于data.table,将该列分配给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 

问:为什么在data.table版本中有一个逗号,data.frame版本中没有逗号?

答:由于data.frames存储为列的列表,您可以跳过逗号。 你也可以添加它,然后你需要将它们分配给一个NULL s, DF[, c("col1", "col2", "col3")] <- list(NULL)