gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 04:13:42 29 4
gpt4 key购买 nike

删除 data.frame 中名为“foo”的列,我能做到:

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

但是,如果您实际上想从 df3 中删除列 "foo" (而不是仅打印 df3 减去列的 View ) "foo") 您确实想使用方法 1。

(请注意,如果您使用依赖于 grep()grepl() 的方法,则需要设置 pattern="^foo$" 而不是 "foo",如果您不想要名称类似于 "fool""buffoon" 的列(即那些包含 foo 作为子字符串的内容)也将被匹配和删除。)

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

接下来的两个惯用语也将起作用 - 如果 df3 包含与 "foo" 匹配的列 - 但可能会失败- 如果没有的话,就会出现意想不到的情况。例如,如果您使用其中任何一个来搜索不存在的列“bar”,您最终将得到一个零行数据表。

因此,它们确实最适合交互式使用,例如,人们可能想要显示一个 data.table,减去名称中包含子字符串 "foo" 的任何列。出于编程目的(或者如果您想要从 df3 中实际删除列而不是从其副本中删除列),方法 1、2a 和 2b 确实是最佳选择。

# Method 4:
df3[, .SD, .SDcols = !patterns("^foo$")]
<小时/>

最后,还有一些使用 with=FALSE 的方法,尽管 data.table 正在逐渐不再使用此参数,因此现在不鼓励您在可以避免的地方使用它;在这里显示,以便您知道该选项存在,以防您确实需要它:

# Method 5a (like Method 3)
df3[, !"foo", with=FALSE]
# Method 5b (like Method 4)
df3[, !grep("^foo$", names(df3)), with=FALSE]
# Method 5b (another like Method 4)
df3[, !grepl("^foo$", names(df3)), with=FALSE]

关于r - 如何在data.table中按名称删除列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9202413/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com