2015-04-01 5 views
8

मेरा डेटा अवलोकन का आदेश दिया गया है और मैं मैनिपुलेशन करते समय जितना संभव हो ऑर्डर करना चाहता हूं।tidyr में लागू सॉर्टिंग :: स्प्रेड और dplyr :: सारांश

this question के लिए उत्तर लें, मैंने डेटाफ्रेम में "ए" से पहले "बी" रखा है। परिणामी विस्तृत डेटा कॉलम "नाम", यानी, "ए" पहले, फिर "बी" द्वारा क्रमबद्ध किया जाता है।

df = data.frame(name=c("B","B","A","A"), 
       group=c("g1","g2","g1","g2"), 
       V1=c(10,40,20,30), 
       V2=c(6,3,1,7)) 

gather(df, Var, Val, V1:V2) %>% 
unite(VarG, Var, group) %>% 
spread(VarG, Val) 

    name V1_g1 V1_g2 V2_g1 V2_g2 
1 A 20 30  1  7 
2 B 10 40  6  3 

क्या मूल आदेश रखने का कोई तरीका है?

name V1_g1 V1_g2 V2_g1 V2_g2 
1 B 10 40  6  3 
2 A 20 30  1  7 

04/02 संपादित करें: इस तरह मैं सिर्फ पाया है dplyr::summarise रूप में अच्छी तरह छँटाई करता है। arrange(name, df$name) अभी भी ऑर्डर को पुनर्स्थापित करने के लिए काम करता है। लेकिन मुझे आश्चर्य है कि पैकेज के डिजाइन से अतिरिक्त सॉर्टिंग आवश्यक है?

df %>% 
    group_by(name) %>% 
    summarise(n()) %>% 

    name n() 
1 A 2 
2 B 2 
+0

दिलचस्प। ऐसा लगता है कि फैल चरण के दौरान, "नाम" चर के लिए कारक स्तर भी बदल जाता है .... – A5C1D2H2I1M1N2O1R2T1

उत्तर

7

आप मूल डेटा फ्रेम में आदेश के आधार पर नाम से क्रमबद्ध कर सकते हैं:

gather(df, Var, Val, V1:V2) %>% 
    unite(VarG, Var, group) %>% 
    spread(VarG, Val) %>% 
    arrange(order(match(name, df$name))) 

# name V1_g1 V1_g2 V2_g1 V2_g2 
# 1 B 10 40  6  3 
# 2 A 20 30  1  7 
+1

धन्यवाद। 'व्यवस्थित करें (मिलान (नाम, डीएफ $ नाम)' भी काम करता है। लेकिन एकाधिक समूह स्तरों से निपटने के लिए, "नाम", "name1", "name2" कहें। यह मुझे समझ में नहीं आता है कि 'फैल' में सॉर्टिंग शामिल है डिफ़ॉल्ट रूप से। – Dong

+0

आप आदेश की आवश्यकता के बारे में सही नहीं हैं। स्तरों के लिए - आप 'व्यवस्था (ए, बी, सी, ...)' में कई तर्कों का उपयोग कर सकते हैं और जैसा चाहें क्रमबद्ध कर सकते हैं (शायद मैं बस देख नहीं सकता समस्या)। लेकिन मैं आपके दर्द को समझता हूं क्योंकि आपके पास पहले से ही सब कुछ है ... – bergant

+0

@bergant, मेरे लिए, सॉर्टिंग के अलावा बड़ी समस्या यह है कि कारक स्तर बदल रहे हैं। – A5C1D2H2I1M1N2O1R2T1

3

आदेश कारक के स्तर के आदेश से लिया जाता है।

str(df) 
'data.frame': 4 obs. of 4 variables: 
$ name : Factor w/ 2 levels "A","B": 2 2 1 1 
$ group: Factor w/ 2 levels "g1","g2": 1 2 1 2 
$ V1 : num 10 40 20 30 
$ V2 : num 6 3 1 7 

देखें कि स्तर "ए", "बी" हैं।

तो तुम क्रम में वे दिखाई पड़ते हैं, यह काम करेंगे करने के लिए स्तरों के क्रम निर्धारित करता है, तो: में

df = data.frame(name=c("B","B","A","A"), 
       group=c("g1","g2","g1","g2"), 
       V1=c(10,40,20,30), 
       V2=c(6,3,1,7)) 

df %>% 
    mutate(name = factor(name,levels=unique(name))) %>% 
    mutate(group = factor(group,levels=unique(group))) %>% 
    gather(Var, Val, V1:V2) %>% 
    unite(VarG, Var, group) %>% 
    spread(VarG, Val) 

परिणाम:

name V1_g1 V1_g2 V2_g1 V2_g2 
1 B 10 40  6  3 
2 A 20 30  1  7