Verwirrung zwischen Faktorstufen und Faktorbezeichnungen

106

Es scheint einen Unterschied zwischen Ebenen und Beschriftungen eines Faktors in R zu geben. Bisher dachte ich immer, dass Ebenen der "echte" Name von Faktorstufen sind und Beschriftungen die Namen, die für die Ausgabe verwendet werden (wie Tabellen und Diagramme). . Dies ist offensichtlich nicht der Fall, wie das folgende Beispiel zeigt:

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"

Ich dachte, dass auf die Ebenen ('a', 'b', 'c') beim Skripten noch irgendwie zugegriffen werden kann, aber das funktioniert nicht:

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

Aber das tut:

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

Meine Frage besteht also aus zwei Teilen:

  • Was ist der Unterschied zwischen Ebenen und Labels?

  • Ist es möglich, unterschiedliche Namen für Faktorstufen für Skripterstellung und Ausgabe zu haben?

Hintergrund: Bei längeren Skripten scheint die Skripterstellung mit kurzen Faktorstufen viel einfacher zu sein. Für Berichte und Diagramme sind diese kurzen Faktorwerte möglicherweise nicht ausreichend und sollten durch Präzisionsnamen ersetzt werden.

Donodarazao
quelle

Antworten:

131

Sehr kurz: Pegel sind die Eingabe, Beschriftungen sind die Ausgabe in der factor()Funktion. Ein Faktor hat nur ein levelAttribut, das durch das labelsArgument in der factor()Funktion festgelegt wird. Dies unterscheidet sich vom Konzept der Labels in Statistikpaketen wie SPSS und kann am Anfang verwirrend sein.

Was Sie in dieser Codezeile tun

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

sagt R, dass es einen Vektor gibt df$f

  • was Sie in einen Faktor verwandeln wollen,
  • in denen die verschiedenen Ebenen als a, b und c codiert sind
  • und für die Sie möchten, dass die Ebenen als Behandlung A usw. gekennzeichnet werden.

Die Faktorfunktion sucht nach den Werten a, b und c, konvertiert sie in numerische Faktorklassen und fügt die Beschriftungswerte dem levelAttribut des Faktors hinzu. Dieses Attribut wird verwendet, um die internen numerischen Werte in die richtigen Beschriftungen umzuwandeln. Aber wie Sie sehen, gibt es kein labelAttribut.

> 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"
Joris Meys
quelle
1
Danke für die schnelle Antwort! Ich glaube, ich verstehe jetzt den Zweck von Levels und Labels. Vielleicht irgendwelche Vorschläge, um die Ausgabe besser lesbar zu machen, ohne Tabellennamen und Plotlegenden manuell zu bearbeiten?
Donodarazao
6
Ich habe die Ebenen oft direkt vor dem Plotten / Erstellen von Beschriftungen transformiert, z. B. die Ebenen während der Manipulation als "a", "b", "c" beibehalten und dann die Ebenen (f) <- Einfügen ("Behandlung", toupper (Ebenen () verwendet) f)), sep = "") [oder etwas] beim Plotten. Oder erstellen Sie einen parallelen Faktor f_pretty, den Sie mitnehmen und nur für die Ausgabe verwenden ...
Ben Bolker
Ich habe über beide nachgedacht, aber beide Methoden haben Nachteile. Das erste kann beim Plotten einer großen Anzahl von Diagrammen mühsam werden, und das zweite kann mühsam werden, wenn beim Scripting viel Datenaggregation erforderlich ist. Aber anscheinend gibt es keine Möglichkeit, dies einfach zu vermeiden, also werde ich Ihren Vorschlägen folgen. :)
Donodarazao
@ 42- Ich bin mir nicht sicher, was du mit "numerischen Werten" meinst. Wenn Sie die internen Werte im Faktor meinen, dann ist das genau das, was ich oben gesagt habe. Daher die Erwähnung interner Zahlenwerte. Wenn Sie das levelsArgument angeben , geben Sie die Werte in der Eingabe an, die mit dem labelsArgument übereinstimmen müssen . R behält die Beschriftungen (als Attribut levelsund es gibt Verwirrung) und speichert ganzzahlige Codes intern. Diese ganzzahligen Codes haben nichts mit den ursprünglichen Werten zu tun, unabhängig vom Typ. Ich denke du hast mich falsch verstanden.
Joris Meys
Entschuldigung. Was Sie schreiben, war auch mein Verständnis, und jetzt, wo ich Ihre Frage noch einmal lese, kann ich nicht sehen, wo ich dachte, dass Sie etwas anderes gesagt haben. Ich werde meinen Kommentar löschen, weil er weniger als nichts hinzufügt.
IRTFM
17

Ich habe ein Paket "lfactors" geschrieben, mit dem Sie entweder auf Ebenen oder Beschriftungen verweisen können.

# 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

Beachten Sie, dass für einen Faktor die Ebenen numerisch sein müssen, damit sie nicht mit den Beschriftungen verwechselt werden können.

pdb
quelle
3
Dies ist ein schönes Paket und danke, dass du darüber gepostet hast (und es geschrieben hast). Es scheint die Art von Funktionalität zu sein, die R-Faktoren eigen sein sollte - schön zu sehen, dass ein Paket diese Art der Zuordnung von Name-Wert-Paaren mit integrierten Äquivalenzprüfungen bietet.
Soren