2010-03-03 14 views
93

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

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 

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

उत्तर

102

उपयोग factor की levels तर्क है:

df <- data.frame(f = 1:4, g = letters[1:4]) 
df 
# f g 
# 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 
# f g 
# 1 1 a 
# 2 2 b 
# 3 3 c 
# 4 4 d 
+1

सावधान रहें धन्यवाद, यह काम किया। कुछ अजीब कारणों से ggplot ने अब पौराणिक कथाओं में क्रम को सही ढंग से बदल दिया है, लेकिन साजिश में नहीं। अजीब। – crangos

+7

ggplot2 ने मुझे स्तरों के क्रम (ऊपर देखें) और डेटा फ्रेम के मानों के क्रम दोनों को बदलने की आवश्यकता है। डीएफ <- डीएफ [एनआरओ (डीएफ): 1,] # रिवर्स – crangos

7

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

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

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

नियम सरल हैं:

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

मैं नहीं जानता कि क्यों इस रूप में नहीं है स्वीकार किए जाते हैं जवाब के रूप में मतदान किया। यह बहुत अधिक जानकारीपूर्ण है। – Rambatino

+7

यदि आप इस दृष्टिकोण का उपयोग करते हैं, तो आपका डेटा गलत लेबल किया गया है। – Nazer

+0

@ नाज़र धन्यवाद, निश्चित – rawr

19
कुछ और

, केवल रिकॉर्ड

## 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]) 

आप अल तो उपयोगी Relevel और combine_factor खोजें।

+2

आपका पहला जवाब मेरे लिए काम नहीं करता है। लेकिन इस काम करता है: 'पुनः क्रमित (df $ पत्र, seq (4,1))' –

+0

मैं एक बहुत ही अजीब स्थिति है जहाँ'reorder' एक डाटासेट पर काम करता है, दूसरे पर नहीं है। अन्य डाटासेट पर, यह एक त्रुटि फेंकता "tapply करने में त्रुटि (एक्स = एक्स, सूचकांक = एक्स, मज़ा = मज़ा, ...): तर्क" एक्स "कोई डिफ़ॉल्ट के साथ याद आ रही है,"। सुनिश्चित नहीं है कि इस समस्या का समाधान क्या है। मुझे डेटासेट के बीच कोई प्रासंगिक अंतर नहीं मिल रहा है। – Deleet

5

आर में कारकों से निपटना काफी असाधारण नौकरी है, मुझे स्वीकार करना होगा ... कारक स्तरों को पुन: व्यवस्थित करते समय, आप अंतर्निहित संख्यात्मक मानों को पुन: व्यवस्थित नहीं कर रहे हैं।यदि आप सांख्यिक को यह कारक कनवर्ट करते हैं, आप मिल जाएगा, अब

> 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 और फिर factor साथ यह relevel की कोशिश करो। ऐसा मत करो !!! levels का उपयोग करें या आप गड़बड़ कर लेंगे (जब तक कि आप बिल्कुल नहीं जानते कि आप क्या कर रहे हैं)।

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

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

> dtf <- data.frame(f = 1:4, g = factor(letters[1:4])) 
> dtf 
    f g 
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 
    f g 
1 1 a 
2 2 b 
3 3 c 
4 4 d 
> with(dtf, as.numeric(g)) 
[1] 4 3 2 1 

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

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

आप ggplot वाक्यविन्यास डाल सकते हैं, इसलिए हम इस पर आपकी सहायता कर सकते हैं!

चीयर्स !!!

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

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

2

चूंकि यह सवाल अंतिम सक्रिय था क्योंकि हैडली ने अपने नए 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() कार्य करता है।

+0

क्या यह अभी भी उपलब्ध है? –

+1

निश्चित रूप से, [यहां] देखें (https://blog.rstudio.org/2016/08/31/forcats-0-1-0/)। – Joe

+0

आप इस प्रकार का कोड लिखना चाहते हैं: 'df%>% उत्परिवर्तित (पत्र = fct_rev (पत्र))'। – jazzurro

2

मैं एक मामले में जहां स्तरों कुछ विशेष वर्ण के साथ-साथ नंबर ले जाने के तार हो सकता है जोड़ना चाहते हैं: उदाहरण के नीचे

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 

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