如何在data.table中按名称删除列?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

中的名为“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对象,此操作不再有效。

提问于
用户回答回答于

下列任何一项都将删除列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]

数据表还支持以下语法:

## Method 3 (could then assign to df3, 
df3[, !"foo", with=FALSE]  

因此,它们实际上最适合交互使用,例如,可能希望显示一个data.table减去任何包含子字符串名称的列。"foo"为了编程目的或者如果想实际从df3方法1、2a和2b实际上是最好的选择。

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

扫码关注云+社区