2012-09-20 14 views
5

में डिफॉल्ट सेपरेटर बदलें जब कास्ट (dcast) नए कॉलम हेडर असाइन करते हैं तो डिफ़ॉल्ट विभाजक को बदलना संभव है?कास्ट

मैं लंबे समय से विस्तृत करने के लिए फ़ाइल को परिवर्तित कर रहा हूँ, और मैं निम्नलिखित हेडर मिलती है:

value_1, value_2, value_3,... 

आकृति बदलें आप "सितं" पैरामीटर असाइन कर सकते हैं में (सितम्बर = "") और जैसे कॉलम हेडर उत्पादन मैं उन्हें करना चाहते हैं:

value1, value2, value3,... 

हालांकि, नयी आकृति प्रदान मिनट अपने डेटा फ्रेम के लिए 200,000 से अधिक पंक्तियों के साथ ले जाता है, जबकि dcast सेकंड लेता है। डकास्ट भी ऑर्डर में कॉलम आउटपुट करता है, जहां reshape नहीं करता है। क्या आउटपुट को डैककास्ट के साथ बदलने का कोई आसान तरीका है, या क्या मुझे कॉलम हेडर मैन्युअल रूप से बदलने की ज़रूरत है?

उदाहरण के लिए:

conc1, conc2, resp1, resp2 

मैं कोशिश की है:

conc_1, conc_2, resp_1, resp_2 

मैं स्तंभ शीर्ष लेखों को पढ़ने के लिए चाहते हैं:

example <- data.frame(id=rep(c(1,2,3,4),4),index=c(rep(1,4),rep(2,4),rep(1,4),rep(2,4)),variable=c(rep("resp",8),rep("conc",8)),value=rnorm(16,5,1)) 
dcast(example,id~variable+index) 

उदाहरण में कॉलम हैडर देता

dcast(example,id~variable+index,sep="") 

डैक पूरी तरह से सीपी को अनदेखा करता है, क्योंकि प्रतीक देने से आउटपुट भी नहीं बदलता है।

+0

कृपया एक पुन: उत्पन्न उदाहरण शामिल करें। –

+0

@mplourde मैंने एक उदाहरण जोड़ा। – dayne

उत्तर

3

आप नहीं कर सकते, क्योंकि उस विकल्प को dcast में शामिल नहीं किया गया था। लेकिन यह dcast चलाने के बाद ऐसा करने के लिए काफी छोटा है।

casted_data <- dcast(example,id~variable+index) 


library(stringr) 
names(casted_data) <- str_replace(names(casted_data), "_", ".") 

> casted_data 
    id conc.1 conc.2 resp.1 resp.2 
1 1 5.554279 5.225686 5.684371 5.093170 
2 2 4.826810 5.484334 5.270886 4.064688 
3 3 5.650187 3.587773 3.881672 3.983080 
4 4 4.327841 4.851891 5.628488 4.305907 

# If you need to do this often, just wrap dcast in a function and 
# change the names before returning the result. 

f <- function(df, ..., sep = ".") { 
    res <- dcast(df, ...) 
    names(res) <- str_replace(names(res), "_", sep) 
    res 
} 

> f(example, id~variable+index, sep = "") 
    id conc1 conc2 resp1 resp2 
1 1 5.554279 5.225686 5.684371 5.093170 
2 2 4.826810 5.484334 5.270886 4.064688 
3 3 5.650187 3.587773 3.881672 3.983080 
4 4 4.327841 4.851891 5.628488 4.305907 
+0

मुझे पता है कि नाम बदलना आसान है, लेकिन यदि संभव हो तो मैं चारों ओर एक रास्ता तलाश रहा था। मेरे पास अंडरस्कोर के साथ अन्य कॉलम हेडर भी हैं, इसलिए इसमें कोड की कुछ और पंक्तियां होंगी - हालांकि यह अभी भी काफी आसान होगी। – dayne

+0

यह _is_ आसपास के रास्ते। आप 'dcast' और' reshape2' से आंतरिक कार्यों को फिर से लिख सकते हैं लेकिन यह और भी काम और पूरी तरह से अनावश्यक होगा। किसी फ़ंक्शन में लपेटने से कोड की लाइनों की संख्या (केवल 1) – Maiasaura

+0

दोनों ही आपको धन्यवाद देगी। – dayne

1

एक विकल्प: data.table पैकेज (देव संस्करण 1.9.5) अब 'सितम्बर' तर्क है में

example <- data.frame(example,by=paste(example$variable,example$index,sep="")) 
dcast(example,id~by) 
2

dcast।

+0

1.9.5 लंबे समय से पुराना है और उपरोक्त @arekolek यह एक अधिक संपूर्ण उत्तर प्रदान करता है – MichaelChirico

2

पर information provided by dbetebenner और using data.table for improved dcast functionality का एक और उदाहरण आधार पर, अपने उदाहरण बन जाता है:

> library(data.table) 
> dcast(setDT(example), id ~ variable + index, sep="") 
    id conc1 conc2 resp1 resp2 
1: 1 5.113707 5.475527 5.938592 4.149636 
2: 2 4.261278 6.138082 5.277773 5.907054 
3: 3 4.350663 4.292398 6.277582 4.167552 
4: 4 5.993198 6.601669 5.232375 5.037936 

setDT() संदर्भ द्वारा सूचियों और data.tables करने के लिए data.frames बदल देता है।

data.table v1.9.6 के साथ परीक्षण किया गया।

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