使用setnames时忽略安全检查

时间:2014-01-06 04:19:12

标签: r data.table

DT<-data.table(a=1,b=2,a=3)
DT
#   a b a
#1: 1 2 3
setnames(DT,"b","c")
#Error in setnames(DT, "b", "c") : 
# 'old' is character but there are duplicate column names: a

在上面的示例中,您可以看到我希望更改未重复的列的标题,但setnames阻止我这样做。有没有办法忽略检查,因为我正在更改的列标题不重复?

2 个答案:

答案 0 :(得分:8)

+1现已在v1.8.11中修复。来自NEWS

  

setnames(DT,“oldname”,“newname”)不再抱怨重复   DT中的列名,只要oldname是唯一且明确的。   感谢Wet Feet突出显示。

答案 1 :(得分:4)

您可以删除setnames来电中的一些逻辑并将其归结为:

set_names <- function(x, old, new) {
  i <- match(old, names(x))
  new <- new[ !is.na(i) ]
  i <- i[ !is.na(i) ]
  invisible(.Call(data.table:::Csetcharvec, attr(x, "names"), as.integer(i), new))
}

DT <- data.table(a=1,b=2,a=3)
set_names(DT, "b", "c")
DT

给了我

> DT
   a c a
1: 1 2 3

请注意,它仅更改重复项中遇到的名字。也就是说,不建议像这样.Call未导出的代码,你应该测试并确保在你的用例中没有中断。