56

(注:データフレームではない)のfactor列のレベルを変更する正しい方法は何ですかdata.table

  library(data.table)
  mydt <- data.table(id=1:6, value=as.factor(c("A", "A", "B", "B", "B", "C")), key="id")

  mydt[, levels(value)]
  [1] "A" "B" "C"

私は次のようなものを探しています:

mydt[, levels(value) <- c("X", "Y", "Z")]

しかし、もちろん、上記の行は機能しません。

    # Actual               # Expected result
    > mydt                  > mydt
       id value                id value
    1:  1     A             1:  1     X
    2:  2     A             2:  2     X
    3:  3     B             3:  3     Y
    4:  4     B             4:  4     Y
    5:  5     B             5:  5     Y
    6:  6     C             6:  6     Z
4

5 に答える 5

73

従来の方法で設定できます。

levels(mydt$value) <- c(...)

mydt従来の構文はオブジェクト全体をコピーするため、非常に大きくない限り、これは十分に高速です。アンファクタリングとリファクタリングのゲームをプレイすることもできます...しかし、とにかく誰もそのゲームが好きではありません.

のコピーなしで参照によってレベルを変更するにはmydt:

setattr(mydt$value,"levels",c(...))

ただし、必ず有効なレベル ベクトル (character十分な長さの型) を割り当ててください。そうしないと、無効な要素になります (levels<-コピーだけでなくチェックも行います)。

于 2013-01-31T21:08:26.200 に答える
9

因子への再割り当ての従来の方法を使用したい

> mydt$value # This we what we had originally
[1] A A B B B C
Levels: A B C
> levels(mydt$value) # just checking the levels
[1] "A" "B" "C"
**# Meat of the re-assignment**
> levels(mydt$value)[levels(mydt$value)=="A"] <- "X"
> levels(mydt$value)[levels(mydt$value)=="B"] <- "Y"
> levels(mydt$value)[levels(mydt$value)=="C"] <- "Z"
> levels(mydt$value)
[1] "X" "Y" "Z"
> mydt # This is what we wanted
   id value
1:  1     X
2:  2     X
3:  3     Y
4:  4     Y
5:  5     Y
6:  6     Z

お気づきかもしれませんが、再割り当ての本質は非常に直感的で、正確なものをチェックします(あいまいな数学、正規表現などがある場合にlevel使用します)。grepl

levels(mydt$value)[levels(mydt$value)=="A"] <- "X" これは、検討中の変数の値を明示的にチェックし、それに再割り当て(など) します - 利点 - 何が何にラベル付けされているかを明示的に知ることができます。levels X

ここではレベルの名前を変更することはlevels(mydt$value) <- c("X","Y","Z")非常に直感的Xではありません。データで表示される最初のレベルに割り当てるだけなので (したがって、順序は本当に重要です)

PPS : レベルが多すぎる場合は、ループ構成を使用します。

于 2014-01-15T11:12:35.377 に答える
5

関連するアプローチを使用して、名前を変更してレベルに追加することもできます。これは、特に(デフォルトではなく)特定の順序でより有益なラベルを必要とするプロットを作成する場合に非常に便利です。

f <- factor(c("a","b"))
levels(f) <- list(C = "C", D = "a", B = "b")

(から変更?levels

于 2013-01-31T21:44:30.793 に答える