从data.table中删除多列


76

从data.table中删除多列的正确方法是什么?我当前正在使用下面的代码,但是当我不小心重复其中一个列名时,出现了意外的行为。我不确定这是否是错误,或者是否不应该以这种方式删除列。

library(data.table)
DT <- data.table(x = letters, y = letters, z = letters)
DT[ ,c("x","y") := NULL]
names(DT)
[1] "z"

上面的工作正常,但是

DT <- data.table(x = letters, y = letters, z = letters)
DT[ ,c("x","x") := NULL]
names(DT)
[1] "z"

3
+1。有趣的发现。如果删除两个“ y”,则会剩下“ x”。如果删除两个“ z”,它会崩溃!
弗兰克

4
现在,您可以:=在调用unique()(即使用DT[ ,unique(c("x","x")) := NULL])中包装分配的LHS,以增强防御能力。由于这似乎是一个data.table的错误,我猜您只需要这样做就可以,直到Matthew Dowle在unique()[.data.table()
乔什·奥布莱恩

关于独特的好主意。谢谢。
matt_k

1
大家好,也许您知道为什么此[R]代码对我不起作用?> myCols <-c(“ Col1”,“ Col2”) > DT [,myCols:= NULL]假设DT包含两个列
MindaugasK

3
@MindaugasK我找到了解决方案-您仍然必须将列列表包装为工作列表。将其更改为DT[, c(myCols):=NULL],就可以解决问题。参见rdatatable.gitlab.io/data.table/articles/…–
文斯,

Answers:


36

这看起来像是可靠的,可复制的错误。已被记录为Bug#2791

似乎重复该列会尝试删除后续的列。
如果没有剩余的列,则R崩溃。


更新:现在已在v1.8.11中修复。来自新闻

现在在同一查询中两次分配给同一列是错误,而不是在某些情况下崩溃。例如DT [,c(“ B”,“ B”):= NULL](通过引用同一列两次删除)。感谢Ricardo(#2751)和matt_k(#2791)报告。测试已添加。


我想补充一点,点语法(在某些DT操作中用作列表的快捷方式)在这里不起作用,即DT[ , .("x","x") := NULL]会失败。好像它必须是列名称作为字符串的向量。
酒吧

19

该问题的答案已被回答,但请注意。

我更喜欢以下语法来删除多列

DT[ ,`:=`(x = NULL, y = NULL)]

因为它与添加多个列(变量)相匹配

DT[ ,`:=`(x = letters, y = "Male")]

这还将检查重复的列名。因此,尝试x两次删除将引发错误消息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.