2011-05-03 112 views
69

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」),可以在某種程度上仍然可以編寫腳本時訪問,但是這並未「T工作:

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

但這:

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

所以,我的問題由兩個部分組成:

  • 關卡和標籤有什麼區別?

  • 對於腳本和輸出可以有不同的因子級別名稱嗎?

背景:對於較長的腳本,短因子水平的腳本似乎更容易。但是,對於報告和圖表來說,這個短期因素水平可能不足,應該用高級名稱替換。

回答

91

非常短:水平是輸入,標籤是factor()函數中的輸出。一個因素只有level屬性,該屬性由factor()函數中的labels參數設置。這與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" 
+0

感謝您的快速回答!我想我現在明白關卡和標籤的用途。也許有沒有人工編輯表名和圖例的人性化輸出的更好的可讀性的建議? – donodarazao 2011-05-03 13:02:18

+3

在繪製/製作標籤之前,我經常會轉換關卡的級別,例如在操作時保持水平爲「a」,「b」,「c」,然後在水平(f)< - 粘貼(「治療」,toupper(水平(f)),sep =「」)[或某物]繪圖。或者創建一個並行因子f_pretty,並將其用於輸出...... – 2011-05-03 14:13:31

+0

我曾考慮過這兩種方法,但這兩種方法都有缺點。當繪製大量圖表時,第一個可能會變得乏味,而當腳本中涉及大量數據聚合時,第二個可能會變得乏味。但顯然沒有辦法很容易避免,所以我會隨着你的建議。 :) – donodarazao 2011-05-04 07:22:27

7

我寫了一個軟件包「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要求級別是數字,以便它們不能與標籤混淆。