Faktör seviyeleri ve faktör etiketleri arasındaki karışıklık


106

R'deki bir faktörün seviyeleri ve etiketleri arasında bir fark var gibi görünüyor Şimdiye kadar, seviyelerin faktör seviyelerinin 'gerçek' adı olduğunu ve çıktı için kullanılan isimler etiketlerin olduğunu düşünmüştüm (tablolar ve grafikler gibi) . Açıkçası, aşağıdaki örnekte gösterildiği gibi durum böyle değildir:

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"

Komut dosyası oluştururken ('a', 'b', 'c') seviyelerine bir şekilde hala erişilebileceğini düşündüm, ancak bu işe yaramıyor:

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

Ancak bu:

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

Öyleyse sorum iki bölümden oluşuyor:

  • Seviyeler ve etiketler arasındaki fark nedir?

  • Komut dosyası oluşturma ve çıktı için faktör seviyeleri için farklı adlara sahip olmak mümkün müdür?

Arka plan: Daha uzun komut dosyaları için, kısa faktör seviyeli komut dosyası yazmak çok daha kolay görünüyor. Bununla birlikte, raporlar ve grafikler için, bu kısa faktör seviyeleri yeterli olmayabilir ve kesin isimlerle değiştirilmelidir.

Yanıtlar:


131

Çok kısa: seviyeler girdidir, etiketler factor()işlevin çıktısıdır . Bir faktörün yalnızca işlevdeki bağımsız değişken leveltarafından belirlenen bir özniteliği vardır . Bu, SPSS gibi istatistiksel paketlerdeki etiket kavramından farklıdır ve başlangıçta kafa karıştırıcı olabilir.labelsfactor()

Bu kod satırında ne yaparsınız

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

R'ye bir vektör olduğunu söylüyor df$f

  • bir faktöre dönüştürmek istediğiniz
  • farklı seviyelerin a, b ve c olarak kodlandığı
  • ve seviyelerin Tedavi A vb. olarak etiketlenmesini istediğiniz

Faktör işlevi, a, b ve c değerlerini arayacak, bunları sayısal faktör sınıflarına dönüştürecek ve etiket değerlerini levelfaktörün özelliğine ekleyecektir . Bu özellik, dahili sayısal değerleri doğru etiketlere dönüştürmek için kullanılır. Ama gördüğünüz gibi, hiçbir labelnitelik yok .

> 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
Hızlı cevap için teşekkürler! Sanırım seviyelerin ve etiketlerin amacını şimdi anlıyorum. Tablo adlarını ve çizim göstergelerini manuel olarak düzenlemeden çıktıyı insanca daha iyi okunabilir hale getirmek için herhangi bir öneriniz var mı?
donodarazao

6
Seviyeleri genellikle etiketleri çizmeden / oluşturmadan hemen önce dönüştürürdüm, örneğin seviyeleri işlerken "a", "b", "c" olarak tutardım, sonra seviyeleri (f) <- yapıştır ("İşlem", toupper (seviyeler ( f)), sep = "") [veya başka bir şey] çizim yaparken. Veya yanınızda taşıdığınız ve yalnızca çıktı için kullanacağınız bir paralel faktör yaratın ...
Ben Bolker

İkisini de düşündüm ama her iki yöntemin dezavantajları var. Birincisi, çok sayıda grafiği çizerken yorucu olabilir ve ikincisi, komut dosyası oluşturmada çok fazla veri toplama söz konusu olduğunda yorucu olabilir. Ama görünüşe göre bundan kolayca kaçınmanın bir yolu yok, bu yüzden önerilerinizle devam edeceğim. :)
donodarazao

@ 42- "Sayısal değerler" ile ne demek istediğinizden emin değilim. Faktördeki dahili değerleri kastediyorsanız, yukarıda söylediğim tam olarak budur. Dolayısıyla dahili sayısal değerlerden bahsedilir . Bağımsız levelsdeğişkeni belirtirseniz, girdideki labelsbağımsız değişkenle eşleştirilmesi gereken değerleri verirsiniz . R, etiketleri (öznitelik levelsolarak ve karışıklık var) tutar ve tam sayı kodlarını dahili olarak depolar. Bu tam sayı kodlarının türü ne olursa olsun orijinal değerlerle hiçbir ilgisi yoktur. Sanırım beni yanlış anladın.
Joris Meys

Özür dilerim. Yazdığın şey benim de anlayışımdı ve şimdi sorunuzu yeniden okuduğuma göre, farklı söylediğinizi düşündüğümü göremiyorum. Yorumumu sileceğim çünkü hiçbir şey eklemiyor.
IRTFM

17

Seviyelere veya etiketlere başvurmanıza izin veren bir "faktör" paketi yazdım.

# 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

Bir faktörün, seviyelerin etiketlerle karıştırılmaması için sayısal olmasını gerektirdiğine dikkat edin.


3
bu güzel bir paket ve bununla ilgili gönderi paylaştığınız (ve yazdığınız) için teşekkürler. R faktörlerine özgü olması gereken işlevsellik türü gibi görünüyor - yerleşik eşdeğerlik kontrolleriyle bu tür ad-değer çifti eşlemesi sağlayan bir paket görmek güzel.
Soren
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.