1. ホーム
  2. r

[解決済み] 因子水準と因子ラベルの混同

2022-05-16 10:03:31

質問

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つの部分から成っています。

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

  • スクリプトと出力のために、因子レベルの異なる名前を持つことは可能ですか?

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

どのように解決するのですか?

簡単に言うと、レベルは入力で、ラベルは出力です。 factor() 関数で出力されます。ファクターは level 属性があり、この属性は labels 引数で設定されます。 factor() という関数があります。これはSPSSなどの統計パッケージのラベルの概念と異なるため、最初のうちは混乱することがあります。

この行のコードで行うこと

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

は、Rに対して、ベクトル df$f

  • 係数に変換したいもの。
  • 異なるレベルがa,b,cのようにコード化されている場合
  • で、レベルを Treatment 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"