2010-09-30 25 views
11

मान लीजिए (सरल करने के लिए) मैं बनाम उपचार डेटा कुछ नियंत्रण युक्त एक मेज है:स्तंभों में पिवट पंक्तियों

Which, Color, Response, Count 
Control, Red, 2, 10 
Control, Blue, 3, 20 
Treatment, Red, 1, 14 
Treatment, Blue, 4, 21 

प्रत्येक रंग के लिए, मैं नियंत्रण और उपचार डेटा के साथ एक ही पंक्ति चाहते हैं, अर्थात्:

Color, Response.Control, Count.Control, Response.Treatment, Count.Treatment 
Red, 2, 10, 1, 14 
Blue, 3, 20, 4, 21 

मुझे लगता है कि ऐसा करने का एक तरीका प्रत्येक नियंत्रण/उपचार सबसेट (रंग कॉलम पर विलय) पर आंतरिक विलय का उपयोग करके है, लेकिन क्या कोई बेहतर तरीका है? मैं रीशेप पैकेज सोच रहा था या स्टैक फ़ंक्शन किसी भी तरह से ऐसा कर सकता था, लेकिन मुझे यकीन नहीं है।

+2

आप सिर d.put की तरह कुछ (के साथ एक व्यावहारिक data.frame बनाते हैं (डीएफ, 20)) यह उन लोगों के लिए अद्भुत काम करता है जो –

उत्तर

17

reshape पैकेज का उपयोग करना।

पहले, अपने data.frame पिघल:

x <- melt(df) 

फिर डाली:

dcast(x, Color ~ Which + variable) 

निर्भर करता है जिस पर आकृति बदलें पैकेज आप इसके साथ काम कर रहे हैं के संस्करण cast() (नयी आकृति प्रदान) या हो सकता है dcast() (reshape2)

वोला।

6

castreshape पैकेज से फ़ंक्शन (आधार आर में reshape फ़ंक्शन के साथ भ्रमित नहीं होने के लिए) यह और कई अन्य चीजें कर सकता है। यहां देखें: http://had.co.nz/reshape/

+0

का उत्तर देने की कोशिश कर रहे हैं ओह, हाँ, मेरा मतलब reshape पैकेज था। मुझे यकीन नहीं था कि मैं जो चाहता हूं उसे करने के लिए कास्ट का उपयोग कैसे करें, यद्यपि? एक करीबी तरीका कास्ट (डेटा, स्थिति ~ परिवर्तनीय | जो) कर रहा है, लेकिन यह स्तंभों की बजाय सूची में नियंत्रण/उपचार डालता है। – grautur

+0

मुझे बिल्कुल याद नहीं है, लेकिन मुझे पूरा यकीन है कि reshape पैकेज के दस्तावेज़ में बिल्कुल ऐसा करने का एक उदाहरण है। आपको यह बताना होगा कि आप कॉलम नामों का निर्माण कैसे करना चाहते हैं। – zwol

3

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

मेरे मामले में, 3 कॉलम और 672,338 पंक्तियों के साथ एक पतला डेटा फ्रेम को रिव्यूप के साथ 34 सेकंड, मेरे आर कोड के साथ 25 सेकंड और सी के साथ 2.3 सेकंड ले गए। विडंबना यह है कि सी कार्यान्वयन मेरे लिखने के लिए शायद आसान था (गति के लिए ट्यूनेड) आर कार्यान्वयन।

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

#include <R.h> 
#include <Rinternals.h> 
/* 
* This mutates the result matrix in place. 
*/ 
SEXP 
dtk_pivot_skinny_to_wide(SEXP n_row ,SEXP vi_1 ,SEXP vi_2 ,SEXP v_3 ,SEXP result) 
{ 
    int ii, max_i; 
    unsigned int pos; 
    int nr = *INTEGER(n_row); 
    int * aa = INTEGER(vi_1); 
    int * bb = INTEGER(vi_2); 
    double * cc = REAL(v_3); 
    double * rr = REAL(result); 
    max_i = length(vi_2); 
    /* 
    * R stores matrices by column. Do ugly pointer-like arithmetic to 
    * map the matrix to a flat vector. We are translating this R code: 
    * for (ii in 1:length(vi.2)) 
    *  result[((n.row * (vi.2[ii] -1)) + vi.1[ii])] <- v.3[ii] 
    */ 
    for (ii = 0; ii < max_i; ++ii) { 
     pos = ((nr * (bb[ii] -1)) + aa[ii] -1); 
     rr[pos] = cc[ii]; 
     /* printf("ii: %d \t value: %g \t result index: %d \t new value: %g\n", ii, cc[ii], pos, rr[pos]); */ 
    } 
    return(result); 
} 
+0

क्या आप उदाहरण प्रदान कर सकते हैं? –

+0

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

6

विकल्पों को जोड़ने के लिए (कई सालों बाद) ....

बेस आर में सामान्य दृष्टिकोण में reshape फ़ंक्शन शामिल होगा (जो आम तौर पर मास्टर के लिए समय लेने वाले तर्कों की भीड़ के कारण गैर-लोकप्रिय है)। यह छोटे डेटासेट के लिए एक बहुत ही कुशल कार्य है, लेकिन हमेशा अच्छी तरह से स्केल नहीं करता है।

reshape(mydf, direction = "wide", idvar = "Color", timevar = "Which") 
# Color Response.Control Count.Control Response.Treatment Count.Treatment 
# 1 Red    2   10     1    14 
# 2 Blue    3   20     4    21 

पहले से ही कवर "नयी आकृति प्रदान" और "reshape2" से cast/dcast हैं (और अब, dcast.data.table से "data.table", विशेष रूप से उपयोगी आप बड़े डेटासेट है जब)।लेकिन यह भी Hadleyverse से, वहाँ "tidyr" है, जो "dplyr" पैकेज के साथ अच्छी तरह से काम करता है:

library(tidyr) 
library(dplyr) 
mydf %>% 
    gather(var, val, Response:Count) %>% ## make a long dataframe 
    unite(RN, var, Which) %>%    ## combine the var and Which columns 
    spread(RN, val)      ## make the results wide 
# Color Count_Control Count_Treatment Response_Control Response_Treatment 
# 1 Blue   20    21    3     4 
# 2 Red   10    14    2     1 

यह भी ध्यान रखें करने के लिए हो सकता है कि "data.table" की प्रकाशित होने वाली संस्करण में, dcast.data.table फ़ंक्शन को आपके डेटा को पहले melt के बिना संभालने में सक्षम होना चाहिए।

dcast की data.table कार्यान्वयन आप इसे पहले पिघलने के बिना एक विस्तृत प्रारूप करने के लिए एकाधिक स्तंभों कन्वर्ट करने के लिए अनुमति देता है, इस प्रकार है:

library(data.table) 
dcast(as.data.table(mydf), Color ~ Which, value.var = c("Response", "Count")) 
# Color Response_Control Response_Treatment Count_Control Count_Treatment 
# 1: Blue    3     4   20    21 
# 2: Red    2     1   10    14 
+1

'रीशेप' उदाहरण के लिए धन्यवाद। I मान लें कि मूल प्रश्न के साथ आपके 'reshape' उदाहरण को' reshape' फ़ंक्शन आधिकारिक दस्तावेज में जोड़ा जाना चाहिए। – user1700890

संबंधित मुद्दे