如何通过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
如果你想通过列名来完成,那么对于j
, which(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有列col1
, col2
, col3
, col4
, col5
, coln
。
要删除它们的一个子集:
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)
。