5

主な問題: を使用setattrしてレベル名を変更すると、不要な重複が保持されます。

いくつかの因子レベルを持ついくつかのデータを消去していますが、それらはすべて同じで、2 つ以上の異なるレベルとして表示されます。(このエラーは主にタイプミスとファイル エンコーディングの問題によるものです) 153,000 個の要素があり、約 5% を修正する必要があります。

次の例では、ベクトルに 3 つのレベルがあり、そのうちの 2 つを 1 つに折りたたむ必要があります。

  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

ベクトルは の一部です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参照によって属性を変更するための低レベルの強引な方法です。「レベル」属性が特別であることを知りません。にはより多くの機能がありますが、 (base )の全体をコピーするlevels<-ことがわかっているのではないかと思います。levels(DT$col)<-newlevelsDT<-setattr

私は間違っているとは言いません。これは正しく有効な要因ですが、たまたまレベルが重複しているだけです。

重複したレベルを削除するには、(テストされていない)と思います:

mydt1[,factorCol:=factor(factorCol)]

するべきです。変更したレベルを見つけ、重複の最初のレベルを指すように整数を変更し、レベルから重複を削除することで、それよりも速く進むことができます。への呼び出しは、factor()基本的にゼロから開始します (つまり、すべての要素を強制して再一致させcharacterます)。

于 2013-02-07T17:56:53.603 に答える