84

从 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"
4

2 回答 2

39

这看起来像一个可靠的、可重现的错误。它已被归档为Bug #2791

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


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

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

于 2013-05-19T20:07:45.650 回答
20

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

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

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

因为它匹配添加多个列(变量)的那个

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

这也检查重复的列名。所以尝试丢弃x两次会抛出错误消息。

于 2015-10-02T19:42:27.690 回答