दिलचस्प पोस्ट
बार्ड में stderr और stdout पुनर्निर्देशित करें मुझे ऑब्जेक्ट के बजाय एक संकेतक का उपयोग क्यों करना चाहिए? मूल डेटा फ्रेम में वापस एकत्रित मूल्यों में शामिल होना वीबीए का उपयोग कर एक्सेल एप्लीकेशन बंद करना डॉट का उपयोग कैसे करें "।" शब्दकोश के सदस्यों का उपयोग करने के लिए? एक UITableView की "उछाल क्षेत्र" में हल्की भूरे रंग की पृष्ठभूमि एक संपत्ति ExpandoObject पर मौजूद है या नहीं पता कैसे? मैं लेबल टैग की चौड़ाई को कैसे नियंत्रित कर सकता / सकती हूं? C # .NET का उपयोग कर फ़ोल्डर में "प्रत्येक व्यक्ति" विशेषाधिकार जोड़ें एएसपी.NET MVC 4 अनुमति कोड के साथ कस्टम ऑथराइज विशेषता (बिना भूमिकाओं) मैं jQuery में एक क्लिक और पकड़ के लिए कैसे सुन सकता हूँ? "शाखा", "टैग" और "ट्रंक" का मतलब उपवर्ती भंडारों में क्या होता है? जावा में म्यूटक्स और सेमाफोर क्या है? मुख्य अंतर क्या है? सी के लिए उपयोगी जीसीसी झंडे एक खोजशब्द का उपयोग कर PHP mysql खोज एकाधिक तालिकाओं

मूल्यों को बदलते बिना एक कारक के स्तर को पुन: व्यवस्थित करें

मेरे पास कुछ संख्यात्मक चर और कुछ विशिष्ट factor वैरिएबल के साथ डेटा फ्रेम है I उन कारकों के लिए स्तरों का क्रम मैं जिस तरह से करना चाहता हूं, वह ऐसा नहीं है।

 numbers <- 1:4 letters <- factor(c("a", "b", "c", "d")) df <- data.frame(numbers, letters) df # numbers letters # 1 1 a # 2 2 b # 3 3 c # 4 4 d 

यदि मैं स्तरों का क्रम बदलता हूं, तो पत्र अब उनके संगत नंबरों के साथ नहीं हैं (मेरा डेटा इस बिंदु से कुल बकवास है)।

 levels(df$letters) <- c("d", "c", "b", "a") df # numbers letters # 1 1 d # 2 2 c # 3 3 b # 4 4 a 

मैं केवल स्तर आदेश बदलना चाहता हूं, इसलिए जब साजिश रचने पर, सलाखों को वांछित क्रम में दिखाया जाता है – यह डिफ़ॉल्ट वर्णमाला क्रम से अलग हो सकता है

Solutions Collecting From Web of "मूल्यों को बदलते बिना एक कारक के स्तर को पुन: व्यवस्थित करें"

factor के levels तर्क का उपयोग करें:

 df <- data.frame(f = 1:4, g = letters[1:4]) df # fg # 1 1 a # 2 2 b # 3 3 c # 4 4 d levels(df$g) # [1] "a" "b" "c" "d" df$g <- factor(df$g, levels = letters[4:1]) # levels(df$g) # [1] "d" "c" "b" "a" df # fg # 1 1 a # 2 2 b # 3 3 c # 4 4 d 

कुछ और, सिर्फ रिकॉर्ड के लिए

 ## reorder is a base function df$letters <- reorder(df$letters, new.order=letters[4:1]) library(gdata) df$letters <- reorder.factor(df$letters, letters[4:1]) 

आपको उपयोगी रीलेवल और गठबंधनकर्ता भी मिल सकता है।

तो आप जो चाहते हैं, आर लेक्सिकन में, केवल एक निश्चित फ़ैक्टर वैरिएबल के लिए लेबल्स बदलना है (यानी, आंकड़े छोड़ दें, साथ ही कारक स्तर , अपरिवर्तित)।

 df$letters = factor(df$letters, labels=c("d", "c", "b", "a")) 

यह देखते हुए कि आप केवल डेटापॉइंट-टू-लेबल मैपिंग बदलना चाहते हैं, न कि डेटा या फ़ैक्टर स्कीमा (कैसे डेटापॉइंट व्यक्तिगत डिब्बे या फ़ैक्टर मूल्यों में बाइन किया गया है, यह जानने में मदद मिल सकती है कि मैपिंग मूल रूप से सेट होने पर सेट की जाती है। कारण।

नियम सरल हैं:

  • लेबल को सूचकांक मूल्य के आधार पर मैप किया जाता है (यानी, स्तरों पर मूल्य [2] लेबल दिया जाता है, लेबल [2]);
  • कारक स्तर उन्हें तर्कों के माध्यम से पारित करके स्पष्ट रूप से सेट किया जा सकता है; या
  • अगर स्तरों के तर्क के लिए कोई मूल्य नहीं दिया जाता है, तो डिफ़ॉल्ट मान का उपयोग किया जाता है, जो डेटा विपत्र ( डेटा तर्क के लिए) में पारित किए जाने वाले परिणाम को अनन्य करते हैं;
  • लेबल लेबल तर्क के माध्यम से स्पष्ट रूप से सेट किया जा सकता है; या
  • यदि लेबल मूल्य के लिए कोई मूल्य नहीं दिया जाता है, तो डिफ़ॉल्ट मान का उपयोग किया जाता है जो कि केवल वेक्टर का स्तर है

आर में कारकों से निपटना काफी अजीब काम है, मुझे स्वीकार करना होगा … जबकि कारक स्तरों की पुनर्व्यवस्था, आप अंतर्निहित संख्यात्मक मानों की पुनर्व्यवस्था नहीं कर रहे हैं यहां एक छोटा प्रदर्शन है:

 > numbers = 1:4 > letters = factor(letters[1:4]) > dtf <- data.frame(numbers, letters) > dtf numbers letters 1 1 a 2 2 b 3 3 c 4 4 d > sapply(dtf, class) numbers letters "integer" "factor" 

अब, यदि आप इस कारक को न्यूमेरिक में परिवर्तित करते हैं, तो आपको मिलेगा:

 # return underlying numerical values 1> with(dtf, as.numeric(letters)) [1] 1 2 3 4 # change levels 1> levels(dtf$letters) <- letters[4:1] 1> dtf numbers letters 1 1 d 2 2 c 3 3 b 4 4 a # return numerical values once again 1> with(dtf, as.numeric(letters)) [1] 1 2 3 4 

जैसा कि आप देख सकते हैं … स्तरों को बदलकर, आप केवल स्तरों को बदलते हैं (जो बताएंगे, एह?), संख्यात्मक मान नहीं! लेकिन, जब आप योनथान चांग के सुझाव के रूप में factor फ़ंक्शन का उपयोग करते हैं, तो कुछ अलग होता है: आप खुद संख्यात्मक मान बदलते हैं

आपको एक बार फिर त्रुटि मिल रही है 'क्योंकि आप levels करते levels और फिर इसे factor साथ रिलीज करने का प्रयास करते हैं ऐसा मत करो !!! levels उपयोग करें या आप गड़बड़ कर लेंगे (जब तक कि आप बिल्कुल नहीं जानते कि आप क्या कर रहे हैं)।

एक lil 'सुझाव: आर ऑब्जेक्ट्स के रूप में एक समान नाम के साथ अपने ऑब्जेक्ट्स का नामांकन से बचें ( df एफ वितरण के लिए घनत्व फ़ंक्शन है, letters लोअरकेस वर्णमाला पत्र देता है)। इस विशेष मामले में, आपका कोड दोषपूर्ण नहीं होगा, लेकिन कभी-कभी यह हो सकता है … लेकिन यह भ्रम पैदा कर सकता है, और हम ऐसा नहीं करना चाहते, हम करते हैं?!? =)

इसके बजाय, इस तरह से कुछ का उपयोग करें (मैं एक बार फिर से शुरुआत करूँगा):

 > dtf <- data.frame(f = 1:4, g = factor(letters[1:4])) > dtf fg 1 1 a 2 2 b 3 3 c 4 4 d > with(dtf, as.numeric(g)) [1] 1 2 3 4 > dtf$g <- factor(dtf$g, levels = letters[4:1]) > dtf fg 1 1 a 2 2 b 3 3 c 4 4 d > with(dtf, as.numeric(g)) [1] 4 3 2 1 

ध्यान दें कि आप g बजाय df और letters साथ data.frame भी नाम दे सकते हैं, और परिणाम ठीक हो जाएगा। दरअसल, यह कोड आपके द्वारा पोस्ट किए गए एक जैसा है, केवल नाम बदल दिए जाते हैं। यह हिस्सा factor(dtf$letter, levels = letters[4:1]) कोई त्रुटि नहीं factor(dtf$letter, levels = letters[4:1]) , लेकिन यह उलझन में हो सकता है!

?factor मैनुअल पढ़ें पूरी तरह से! factor(g, levels = letters[4:1]) बीच अंतर क्या factor(g, levels = letters[4:1]) और factor(g, labels = letters[4:1]) ? levels(g) <- letters[4:1] में समान क्या levels(g) <- letters[4:1] और g <- factor(g, labels = letters[4:1]) ?

आप ggplot सिंटैक्स डाल सकते हैं, इसलिए हम इस पर आपको अधिक सहायता कर सकते हैं!

चीयर्स !!!

संपादित करें:

ggplot2 वास्तव में दोनों स्तरों और मूल्यों को बदलने की आवश्यकता है? हम्म … मैं इस एक को खोद दूंगा …

चूंकि यह सवाल अंतिम रूप से सक्रिय था, इसलिए हेडली ने कारकों के हेरफेर करने के लिए अपने नए forcats पैकेज को जारी किया है और मुझे यह बेहद उपयोगी लग रहा है। ओपी के डेटा फ्रेम से उदाहरण:

 levels(df$letters) # [1] "a" "b" "c" "d" 

स्तरों को उल्टा करने के लिए:

 library(forcats) fct_rev(df$letters) %>% levels # [1] "d" "c" "b" "a" 

अधिक स्तर जोड़ने के लिए:

 fct_expand(df$letters, "e") %>% levels # [1] "a" "b" "c" "d" "e" 

और बहुत अधिक उपयोगी fct_xxx() फ़ंक्शंस

मैं एक और मामले जोड़ना चाहूंगा जहां स्तर कुछ विशेष वर्णों के साथ संख्याओं को ले जाने वाला तार हो सकता है: उदाहरण के नीचे की तरह

 df <- data.frame(x = c("15-25", "0-4", "5-10", "11-14", "100+")) 

x का डिफ़ॉल्ट स्तर है:

 df$x # [1] 15-25 0-4 5-10 11-14 100+ # Levels: 0-4 100+ 11-14 15-25 5-10 

यहां अगर हम संख्यात्मक मूल्य के अनुसार कारक स्तर को पुन: क्रमित करना चाहते हैं, बिना स्पष्ट रूप से स्तरों को लिखना, हम क्या कर सकते हैं

 library(gtools) df$x <- factor(df$x, levels = mixedsort(df$x)) df$x # [1] 15-25 0-4 5-10 11-14 100+ # Levels: 0-4 5-10 11-14 15-25 100+ as.numeric(df$x) # [1] 4 1 2 3 5 

मुझे उम्मीद है कि यह भविष्य के पाठकों के लिए उपयोगी जानकारी के रूप में माना जा सकता है।