2011-05-03 32 views
69

आर में एक कारक के स्तर और लेबल के बीच एक अंतर लगता है, अब तक मैंने हमेशा सोचा था कि स्तर कारक स्तरों का 'असली' नाम था, और लेबल थे आउटपुट के लिए उपयोग किए जाने वाले नाम (जैसे तालिकाओं और भूखंड)। इस नहीं करताकारक स्तर और कारक लेबल के बीच भ्रम

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" 

मैंने सोचा था कि के स्तर ('एक', 'बी', 'सी') किसी भी तरह अभी भी जब पटकथा पहुँचा जा सकता है, लेकिन: जाहिर है, यह नहीं मामला है, जैसा कि निम्न उदाहरण से पता चलता है 'टी काम:

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

लेकिन इस करता है:

    :

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

    तो, मेरे सवाल का दो हिस्से होते हैं

  • स्तर और लेबल के बीच क्या अंतर है?

  • क्या स्क्रिप्टिंग और आउटपुट के लिए कारक स्तरों के लिए अलग-अलग नाम होना संभव है?

पृष्ठभूमि: लंबी स्क्रिप्ट के लिए, छोटे कारक स्तरों के साथ स्क्रिप्टिंग बहुत आसान लगती है। हालांकि, रिपोर्ट और भूखंडों के लिए, यह छोटा कारक स्तर पर्याप्त नहीं हो सकता है और इसे सटीक नामों से बदला जाना चाहिए।

उत्तर

91

बहुत छोटा: स्तर इनपुट हैं, लेबल factor() फ़ंक्शन में आउटपुट हैं। एक कारक में केवल level विशेषता है, जो factor() फ़ंक्शन में labels तर्क द्वारा निर्धारित है। यह एसपीएसएस जैसे सांख्यिकीय पैकेजों में लेबल की अवधारणा से अलग है, और शुरुआत में भ्रमित हो सकता है।

आप कोड की इस पंक्ति

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

आर को कह रहा है एक वेक्टर df$f

  • जो आपको एक कारक के रूप में बदल करना चाहते है कि वहाँ में क्या क्या,
  • जिसमें विभिन्न स्तरों को ए, बी, और सी
  • के रूप में कोडित किया गया है और जिसके लिए आप उपचार ए आदि के रूप में लेबल लेबल करना चाहते हैं

कारक फ़ंक्शन ए, बी और सी मानों को देखेगा, उन्हें संख्यात्मक कारक वर्गों में परिवर्तित करेगा, और लेबल मानों को 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

+3

लेबलों की साजिश/निर्माण करने से पहले मैं अक्सर स्तरों को बदलता हूं, उदा। स्तर को "ए", "बी", "सी" के रूप में रखें, जबकि मैनिप्लेटिंग, फिर स्तर (एफ) <- पेस्ट ("ट्रीटमेंट", टॉपर (लेवल (एफ)), सीपी = "") [या कुछ] का उपयोग करें अंकन। या एक समानांतर कारक f_pretty बनाएं जो आप साथ ले जाएं और केवल आउटपुट के लिए उपयोग करें ... –

+0

मैंने दोनों के बारे में सोचा, लेकिन दोनों विधियों के नुकसान हैं। बड़ी संख्या में ग्राफ की साजिश करते समय पहली बार थकाऊ हो सकता है, और दूसरी बार स्क्रिप्टिंग में डेटा एकत्रण में शामिल होने पर थकाऊ हो सकता है। लेकिन जाहिर है कि आसानी से बचने का कोई तरीका नहीं है, इसलिए मैं आपके सुझावों के साथ जाऊंगा। :) – donodarazao

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 

ध्यान दें कि एक लैफैक्टर को यह आवश्यक है कि स्तर संख्यात्मक हो ताकि वे लेबल के साथ भ्रमित न हों।