web-dev-qa-db-ja.com

因子レベルと因子ラベルの混乱

Rの因子のレベルとラベルには違いがあるようです。これまで、レベルは因子レベルの「実際の」名前であり、ラベルは出力に使用される名前(テーブルやプロットなど)であると常に考えていました。次の例に示すように、明らかにそうではありません。

df <- data.frame(v=c(1,2,3),f=c('a','b','c'))
str(df)
'data.frame':   3 obs. of  2 variables:
 $ v: num  1 2 3
 $ f: Factor w/ 3 levels "a","b","c": 1 2 3

df$f <- factor(df$f, levels=c('a','b','c'),
  labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))
levels(df$f)
[1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX"

スクリプトを作成するときに、レベル( 'a'、 'b'、 'c')に何らかの方法でアクセスできると考えましたが、これは機能しません。

> df$f=='a'
[1] FALSE FALSE FALSE

しかし、これは:

> df$f=='Treatment A: XYZ' 
[1]  TRUE FALSE FALSE

したがって、私の質問は2つの部分で構成されています。

  • レベルとラベルの違いは何ですか?

  • スクリプトと出力の要因レベルに異なる名前を付けることは可能ですか?

背景:長いスクリプトの場合、短い因子レベルでのスクリプト作成ははるかに簡単に思えます。ただし、レポートとプロットの場合、この短い因子レベルは適切でない場合があり、より正確な名前に置き換える必要があります。

91
donodarazao

非常に短い:レベルは入力、ラベルはfactor()関数の出力です。因子にはlevel属性のみがあり、factor()関数のlabels引数によって設定されます。これは、SPSSのような統計パッケージのラベルの概念とは異なり、最初は混乱する可能性があります。

このコード行で行うこと

df$f <- factor(df$f, levels=c('a','b','c'),
  labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))

ベクトルdf$fがあることをRに伝えています

  • ファクターに変換したい
  • 異なるレベルがa、b、およびcとしてコーディングされている
  • また、レベルにトリートメントAなどのラベルを付けたい場合.

因子関数は、値a、b、およびcを探し、それらを数値因子クラスに変換し、因子のlevel属性にラベル値を追加します。この属性は、内部数値を正しいラベルに変換するために使用されます。しかし、ご覧のとおり、label属性はありません。

> df <- data.frame(v=c(1,2,3),f=c('a','b','c'))    
> attributes(df$f)
$levels
[1] "a" "b" "c"

$class
[1] "factor"

> df$f <- factor(df$f, levels=c('a','b','c'),
+   labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))    
> attributes(df$f)
$levels
[1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX"

$class
[1] "factor"
119
Joris Meys

レベルまたはラベルを参照できるパッケージ「lfactors」を作成しました。

# packages
install.packages("lfactors")
require(lfactors)

flips <- lfactor(c(0,1,1,0,0,1), levels=0:1, labels=c("Tails", "Heads"))
# Tails can now be referred to as, "Tails" or 0
# These two lines return the same result
flips == "Tails"
#[1]  TRUE FALSE FALSE  TRUE  TRUE FALSE
flips == 0 
#[1]  TRUE FALSE FALSE  TRUE  TRUE FALSE

ラベルと混同しないように、lfactorではレベルが数値である必要があることに注意してください。

12
pdb