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
阻止我这样做。有没有办法忽略检查,因为我正在更改的列标题不重复?
答案 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
未导出的代码,你应该测试并确保在你的用例中没有中断。