37

設定できない関数の例はlabels. 因子ラベルは、因子関数で作成された場合にのみ設定できます。機能はありませんlabels<-。要因の「ラベル」と「レベル」は意味をなさない....

>  fac <- factor(1:3, labels=c("one", "two", "three"))
> fac
[1] one   two   three
Levels: one two three
> labels(fac)
[1] "1" "2" "3"

OK、私はラベルを求めました。これは factor 呼び出しによって設定されたものと思われるかもしれませんが、かなりの結果が得られました...直感的ではないという言葉は何ですか?

> levels(fac)
[1] "one"   "two"   "three"

したがって、ラベルを設定することは実際にはレベルを設定しているように見えます。

>  fac <- factor(1:3, levels=c("one", "two", "three"))
> levels(fac)
[1] "one"   "two"   "three"

それは予想どおりです。では、レベルを設定するときのラベルとは何ですか?

>  fac <- factor(1:3, levels=c("one", "two", "three"), labels=c("x","y", "z") )
> labels(fac)
[1] "1" "2" "3"
> levels(fac)
[1] "x" "y" "z"

あなたが私に尋ねると、奇妙なことを言います。factor の 'labels' 引数は、レベルを指定するための 'levels' 引数よりも優先されるようです。なぜこれが必要なのですか?混乱した用語のようです。そして、なぜlabels()as.character(as.numeric(fac)) で取得されると想像していたものを返すのでしょうか?

(これは、質問に移動するように求められた代入関数に関する以前の回答の [そのようにラベル付けされた] 接線のコメントでした。したがって、ここで私を啓発する機会があります。)

4

2 に答える 2

31

labelsとの違いについて考える方法( Tommy が彼の回答で説明している関数をlevels無視する) は、 R に入力 ( ) で検索する値と、結果のレベルで使用する順序を伝えることを目的としていると思います。オブジェクトであり、入力が要因としてコード化された後にレベルのを変更することです...トミーの答えで示唆されているように、それによって返されるオブジェクトの部分はありません...呼び出されるレベルだけです引数によって調整されました...(泥のようにクリア)。labels()levelsxfactorlabelsfactorfactor()labelslabels

例えば:

> f <- factor(x=c("a","b","c"),levels=c("c","d","e"))
> f
[1] <NA> <NA> c  
Levels: c d e
> str(f)
Factor w/ 3 levels "c","d","e": NA NA 1

の最初の 2 つの要素がxに見つからなかったため、levelsの最初の 2 つの要素はfですNA"d""e"は に含まれていたため、では発生しませんでしたがlevels、 のレベルに表示されます。fx

今ではlabels

> f <- factor(c("a","b","c"),levels=c("c","d","e"),labels=c("C","D","E"))
> f
[1] <NA> <NA> C   
Levels: C D E

R は、要因に含まれるべきものを把握した後、レベルを再コーディングします。もちろん、これを使用して、次のような頭を悩ませることもできます。

> f <- factor(c("a","b","c"),levels=c("c","d","e"),labels=c("a","b","c"))
> f
[1] <NA> <NA> a   
Levels: a b c

考える別の方法levelsfactor(x,levels=L1,labels=L2)

f <- factor(x,levels=L1)
levels(f) <- L2

この例を適切に表現したバージョンは、Pat Burns のR infernoに適していると思います。セクション 8.2 には多くの因数パズルがありますが、この特定のパズルではありません ...

于 2011-08-19T23:46:20.490 に答える
17

このlabels関数は、因子のラベルを取得するのに最適なように思えます。

...しかし、labels関数は因数とは何の関係もありません! 何かをオブジェクトに「ラベル付け」するための一般的な方法として使用されます。原子ベクトルの場合、これが名前になります。しかし、名前がない場合、labels関数は文字列に強制された要素インデックスを返します - のようなものas.character(seq_along(x))です。

…因子にラベルを付けてみると、このようになります。因子は名前のない整数ベクトルですが、levels属性があります。

因子にはラベルがありません。レベルしかありません。へのlabels引数factorは、一連の文字列を指定して別の一連の文字列をレベルとして生成できるようにするための単なる方法です...しかし、さらに混乱させるために、dput関数はlevels属性を.Label!として出力します。遺産だと思うのですが…

# Translate lower case letters to upper case.
f <- factor(letters[2:4], letters[1:3], LETTERS[1:3])
dput(f)
#structure(c(2L, 3L, NA), .Label = c("A", "B", "C"), class = "factor")
attributes(f)
#$levels
#[1] "A" "B" "C"
#
#$class
#[1] "factor"

ただし、labelsは汎用関数なので、次のように定義するとよいでしょうlabels.factor(現在はありません)。おそらくRコアが考慮すべきことはありますか?

labels.factor <- function(x, ...) as.character(x)
于 2011-08-19T23:33:40.087 に答える