5

关键问题:setattr用于更改级别名称,保留不需要的重复项。

我正在清理一些具有多个因子水平的数据,所有这些水平都是相同的,显示为两个或多个不同的水平。(这个错误主要是由于拼写错误和文件编码问题)我有 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

向量是 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

关于为什么会这样和/或改变这种行为的任何选项的任何想法?(即..., droplevels=TRUE?)谢谢

4

1 回答 1

5

setattr是一种通过引用更改属性的低级蛮力方式。它不知道“级别”属性是特殊的。levels<-它里面有更多的功能,但我怀疑你可能已经发现它levels(DT$col)<-newlevels会复制整个DT(base <-),因此你看的速度是setattr.

我不会说不正确的顺便说一句。这是一个正确且有效的因素,但恰好有重复的级别。

要删除重复的级别,我认为(未经测试):

mydt1[,factorCol:=factor(factorCol)]

应该这样做。通过查找您更改了哪些级别,将整数更改为指向第一个重复项,然后从级别中删除副本,可以比这更快。调用factor()基本上从头开始(即强制所有因素到character并重新匹配)。

于 2013-02-07T17:56:53.603 回答