R 从data.table中删除多列

R 从data.table中删除多列,r,data.table,R,Data.table,从data.table中删除多列的正确方法是什么?我目前正在使用下面的代码,但当我不小心重复了其中一个列名时,出现了意外行为。我不确定这是一个bug,还是我不应该这样删除列 library(data.table) DT <- data.table(x = letters, y = letters, z = letters) DT[ ,c("x","y") := NULL] names(DT) [1] "z" 库(data.table) DT这看起来像一个可靠的、可复制的bug。它被归档为

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

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

DT这看起来像一个可靠的、可复制的bug。它被归档为

重复该列可能会尝试删除后续列。
如果没有列保留,则R崩溃


更新:现已在v1.8.11中修复。发件人:

在某些情况下,将同一查询中的同一列分配两次是错误的,而不是崩溃;e、 g.,DT[,c(“B”,“B”):=NULL](通过引用删除同一列两次)。感谢Ricardo()和matt_k()的报道。增加了测试


此问题已得到回答,但请将其视为旁注

我更喜欢使用以下语法删除多个列

DT[ ,`:=`(x = NULL, y = NULL)]
因为它与添加多个列(变量)的列相匹配


这也会检查重复的列名。因此,尝试删除
x
两次将抛出错误消息。

+1。有趣的发现。如果删除两个“y”,则剩下“x”。如果你删除两个“z”,它就会崩溃!现在,您可以将
:=
赋值的LHS包装在对
unique()
的调用中(即使用
DT[,unique(c(“x”,“x”):=NULL)]
)作为额外的防御。因为这看起来像是一个data.table bug,我想你们只需要这样做,直到Matthew Dowle将调用移动到
[.data.table()
中的
unique()
(或与之相当的东西)为止。这是关于unique的好主意。谢谢。大家好,也许你们知道为什么这个[R]代码对我不起作用吗?>myCols DT[,myCols:=NULL]假设DT包含这两个变量columns@MindaugasK我找到了一个解决方案——您仍然必须将列列表包装为一个列表,它才能工作。将其更改为
DT[,c(myCols):=NULL]
,这样就可以了。请看,我想添加点语法(在某些DT操作中用作列表的快捷方式)在这里不起作用,即,
DT[,(“x”,“x”):=NULL]
将失败。似乎它必须是列名称作为字符串的向量。
DT[ ,`:=`(x = NULL, y = NULL)]
DT[ ,`:=`(x = letters, y = "Male")]