कारक स्तरों और कारक लेबल के बीच भ्रम


106

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

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

तो, मेरे प्रश्न में दो भाग हैं:

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

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

बैकग्राउंड: लंबी स्क्रिप्ट्स के लिए, शॉर्ट फैक्टर लेवल के साथ स्क्रिप्टिंग करना ज्यादा आसान लगता है। हालांकि, रिपोर्टों और भूखंडों के लिए, यह छोटा कारक स्तर पर्याप्त नहीं हो सकता है और इसे प्रीइज़र नामों से बदला जाना चाहिए।

जवाबों:


131

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

इस कोड की लाइन में आप क्या करते हैं

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"

1
तेजी से उत्तर के लिए धन्यवाद! मुझे लगता है कि मैं अब स्तरों और लेबल के उद्देश्य को समझता हूं। हो सकता है कि मैन्युअल रूप से टेबल के नाम और प्लॉट किंवदंतियों को संपादित किए बिना आउटपुट को बेहतर तरीके से पढ़ने योग्य बनाने के लिए कोई सुझाव?
डोनोडोराज़ाओ

6
लेबल लगाने / बनाने से पहले मैं अक्सर स्तरों को बदल दूंगा, उदाहरण के लिए जोड़तोड़ करते समय स्तरों को "a", "b", "c" के रूप में रखता हूं, फिर स्तरों (f) का उपयोग करें - पेस्ट ("उपचार"), स्तर (स्तर) f)), sep = "") [या कुछ] साजिश रचने पर। या एक समानान्तर कारक f_pretty बनाएं जो आप साथ लेकर चलते हैं और केवल आउटपुट के लिए उपयोग करते हैं ...
बेन बोल्कर

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

@ 42- मुझे यकीन नहीं है कि "संख्यात्मक मान" से आपका क्या तात्पर्य है। यदि आप कारक में आंतरिक मूल्यों का मतलब है तो यह वही है जो मैंने ऊपर कहा था। इसलिए आंतरिक संख्यात्मक मूल्यों का उल्लेख । यदि आप levelsतर्क निर्दिष्ट करते हैं, तो आप इनपुट में दिए गए मानों को labelsतर्क से मिलान करते हैं। आर लेबल रखता है (विशेषता के रूप में levels, और वहाँ भ्रम है) और पूर्णांक कोड को आंतरिक रूप से संग्रहीत करता है। इन पूर्णांक कोडों का मूल मूल्यों से कोई लेना-देना नहीं है, चाहे वे किसी भी प्रकार के हों। मुझे लगता है आपने मुझे गलत समझ लिया।
जोरिस मेय्स

क्षमा याचना। आप जो कुछ भी लिख रहे थे वह मेरी समझ के अनुसार था, और अब जब मैं आपके प्रश्न को दोबारा पढ़ रहा हूं, तो मैं यह नहीं देख सकता कि मैंने कहां सोचा था कि आपने अलग तरीके से कहा था। मैं अपनी टिप्पणी हटाऊंगा क्योंकि यह कुछ भी नहीं से कम जोड़ता है।
IRTFM

17

मैंने एक पैकेज "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 के लिए आवश्यक है कि स्तर सांख्यिक हों ताकि वे लेबल के साथ भ्रमित न हों।


3
यह एक अच्छा पैकेज है और इसके बारे में पोस्ट करने (और इसे लिखने) के लिए धन्यवाद। ऐसा लगता है कि कार्यक्षमता का प्रकार जो आर कारकों के मूल निवासी होना चाहिए - एक पैकेज को देखना अच्छा है जो इस तरह के नाम-वैल्यू जोड़ी मैपिंग को अंतर्निर्मित समतुल्यता जांच के साथ प्रदान करता है।
सोरेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.