Ric*_*rta 5 r duplicate-removal data.table
关键问题:使用setattr更改级别名称,保留不需要的重复项.
我正在清理一些数据,其中我有sevearl因子水平,所有这些都是相同的,显示为两个或更多不同的水平.(此错误主要是由于拼写错误和文件编码问题)我有153K因素,需要更正5%.
例
在以下示例中,向量具有三个级别,其中两个级别需要折叠为一个级别.
incorrect <- factor(c("AOB", "QTX", "A_B")) # this is how the data were entered
correct <- factor(c("AOB", "QTX", "AOB")) # this is how the data *should* be
> incorrect
[1] AOB QTX A_B
Levels: A_B AOB QTX <~~ Note that "A_B" should be "AOB"
> correct
[1] AOB QTX AOB
Levels: AOB QTX
Run Code Online (Sandbox Code Playgroud)
向量是a的一部分data.table.
使用该levels<-功能更改级别名称时,一切正常.
但是,如果使用setattr,则会保留不需要的重复项.
mydt1 <- data.table(id=1:3, incorrect, key="id")
mydt2 <- data.table(id=1:3, incorrect, key="id")
# assigning levels, duplicate levels are dropped
levels(mydt1$incorrect) <- gsub("_", "O", levels(mydt1$incorrect))
# using setattr, duplicate levels are not dropped
setattr(mydt2$incorrect, "levels", gsub("_", "O", levels(mydt2$incorrect)))
# RESULTS
# Assigning Levels # Using `setattr`
> mydt1$incorrect > mydt2$incorrect
[1] AOB QTX AOB [1] AOB QTX AOB
Levels: AOB QTX Levels: AOB AOB QTX <~~~ Notice the duplicate level
Run Code Online (Sandbox Code Playgroud)
有关为什么会这样做和/或任何改变此行为的选项的想法?(即..., droplevels=TRUE?)谢谢
setattr是一种通过引用更改属性的低级暴力方式。它不知道“级别”属性是特殊的。levels<-里面有更多功能,但是我怀疑您可能会发现levels(DT$col)<-newlevels它将复制整个DT(base <-),因此对于您来说,它的速度非常快setattr。
我不会说不正确 BTW。这是正确有效的因素,但恰好有重复的级别。
要删除重复的级别,我认为(未测试):
mydt1[,factorCol:=factor(factorCol)]
Run Code Online (Sandbox Code Playgroud)
应该这样做。通过查找已更改的级别,将整数更改为指向重复项中的第一个,然后从级别中删除重复项,可能会比以前更快。对的调用factor()基本上是从头开始的(即,将所有因子character强制转换为并重新匹配)。