要在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对象,这个不再有效。
对于一个数据。如果将列赋值为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)。
你也可以使用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。
非常简单的选项,如果你在一个数据表中有很多单独的列要删除,你想避免输入所有的列名# careadvise
dt <- dt[, -c(1,4,6,17,83,104)]
这将根据列号删除列。
它显然没有那么高效,因为它绕过了数据。表的优势,但如果你处理的行少于50万行,它也可以工作