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


106

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つの部分で構成されています。

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

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

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

回答:


131

非常に短い:レベルは入力、ラベルはfactor()関数の出力です。因子にはlevel属性のみがありlabelsfactor()関数の引数によって設定されます。これは、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としてコード化されている
  • また、レベルを治療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"

1
速い答えをありがとう!レベルとラベルの目的が理解できたと思います。たぶん、テーブル名とプロットの凡例を手動で編集せずに、人が読みやすい出力にするための提案はありますか?
donodarazao

6
ラベルをプロット/作成する直前にレベルを変換することがよくあります。たとえば、操作中はレベルを「a」、「b」、「c」に保ち、levels(f)<-paste( "Treatment"、toupper(levels( f))、sep = "")[または何か]プロットするとき。または、持ち歩き、出力のみに使用する並列係数f_prettyを作成します...
Ben Bolker

私は両方について考えましたが、どちらの方法にも欠点があります。1つ目は、膨大な数のグラフをプロットするときに面倒になる可能性があり、2つ目は、スクリプトに多くのデータ集約が含まれる場合に面倒になる可能性があります。しかし、どうやらそれを簡単に回避する方法はないので、私はあなたの提案に行きます。:)
donodarazao

@ 42-「数値」の意味がわかりません。因子の内部値を意味する場合、それはまさに私が上で言ったことです。したがって、内部数値の言及。levels引数を指定する場合、引数に一致する必要がある入力の値を指定しlabelsます。Rはラベルを(属性として保持しlevels、混乱が生じます)、整数コードを内部に格納します。これらの整数コードは、どのようなタイプであっても、元の値とは関係ありません。あなたは私を誤解したと思います。
Joris Meys、2016年

謝罪。あなたが書いたのも私の理解でした、そして私があなたの質問を読み直している今、私はあなたが別様に言ったと思ったところを見ることができません。何も追加されないのでコメントを削除します。
IRTFM

17

レベルまたはラベルを参照できるようにする「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ではレベルを数値にする必要があることに注意してください。


3
これは素晴らしいパッケージであり、それについて投稿(そしてそれを書いて)くれてありがとう。Rファクターにネイティブである必要のある種類の機能のようです-この種類の名前と値のペアのマッピングに組み込みの等価性チェックを提供するパッケージを見るといいですね。
ソレン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.