2013-10-13 8 views
9

मुझे यह भी सुनिश्चित नहीं है कि प्रश्न को सही तरीके से कैसे शीर्षकित किया जाए!आर डेटाफ्रेम को फिर से व्यवस्थित करें: कुछ पंक्तियां कॉलम

मान लीजिए मैं एक dataframe घ है:

वर्तमान dataframe:

d <- data.frame(sample = LETTERS[1:2], cat = letters[11:20], count = c(1:10)) 

    sample cat count 
1  A k  1 
2  B l  2 
3  A m  3 
4  B n  4 
5  A o  5 
6  B p  6 
7  A q  7 
8  B r  8 
9  A s  9 
10  B t 10 

और मैं चीजों को इस तरह है कि प्रत्येक बिल्ली मूल्य की अपनी एक स्तंभ बन जाता है फिर से व्यवस्थित करने के लिए कोशिश कर रहा हूँ, नमूना एक कॉलम बनी हुई है (या पंक्ति का नाम बन जाता है), और गिनती नए बिल्ली कॉलम में मान होगी, 0 के साथ जहां नमूना में बिल्ली के लिए कोई गिनती नहीं होती है। इसलिए जैसा:

वांछित dataframe लेआउट:

sample k l m n o p q r s t 
1  A 1 0 3 0 5 0 7 0 9 0 
2  B 0 2 0 4 0 6 0 8 0 10 

इस बारे में जाने के लिए सबसे अच्छा तरीका क्या है?

यह जहाँ तक मैं मिल गया है है:

for (i in unique(d$sample)) { 
    s <- d[d$sample==i,] 
    st <- as.data.frame(t(s[,3])) 
    colnames(st) <- s$cat 
    rownames(st) <- i 
} 

अर्थात मूल dataframe में नमूने के माध्यम से पाशन, और प्रत्येक नमूने सबसेट के लिए transposing। इस मामले में तो मैं

k m o q s 
A 1 3 5 7 9 

और

l n p r t 
B 2 4 6 8 10 

मिल और यह वह जगह है जहाँ मैं अटक जाते हैं। मैंने मर्ज(), बाइंड(), लागू(), ... के साथ चीजों का एक गुच्छा करने की कोशिश की है, लेकिन मैं सही चीज़ पर हिट नहीं कर सकता। इसके अलावा, मैं मदद नहीं कर सकता लेकिन आश्चर्यचकित हूं कि उपरोक्त लूप एक आवश्यक कदम है - कुछ अनस्टैक() शायद?

कहने की जरूरत नहीं है, मैं आर के लिए नया हूं ... अगर कोई मेरी मदद कर सकता है, तो इसकी सराहना की जाएगी!

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

धन्यवाद!

+0

आप जिस ऑपरेशन को करना चाहते हैं वह "लंबा" से "चौड़ा" है। इस सवाल से पूछा गया है और कई बार जवाब दिया गया है। – nograpes

+1

मेरी माफ़ी। मैंने यहां और Google के माध्यम से अंतहीन खोज की, मुझे बस इतना कुछ नहीं मिला जो मुझे चाहिए (मुझे यह जानने के लिए कि मुझे जो चाहिए उसे कॉल करने में मदद नहीं कर रहा है)। मुझे "लंबा"/"चौड़ा" देखने की ज़रूरत होगी ... – crs

उत्तर

9

आधार आर से reshape का उपयोग करना:

nn<-reshape(d,timevar="cat",idvar="sample",direction="wide") 
names(nn)[-1]<-as.character(d$cat) 
nn[is.na(nn)]<-0 
> nn 
    sample k l m n o p q r s t 
1  A 1 0 3 0 5 0 7 0 9 0 
2  B 0 2 0 4 0 6 0 8 0 10 
+0

धन्यवाद, @ मेट्रिक्स - यह भी काम करता है! (और अब मैं समझता हूं कि कौन से नाटककार अपनी टिप्पणी में "लंबे" और "चौड़े" के साथ संदर्भित कर रहे थे!)। जिलर का समाधान अधिक संक्षेप में दिखता है - अन्यथा क्या अंतर है? मदद के लिए शुक्रिया! अतिरिक्त अतिरिक्त सीखने के लिए हमेशा अच्छा है। – crs

+1

@ सीआरएस, बड़ा अंतर यह है कि 'xtabs' और' dcast' दोनों में वास्तव में एक विस्तृत प्रारूप में कनवर्ट करने के लिए केवल एक "मान" चर हो सकता है। उदाहरण के तौर पर, अपने मूल "डी" 'data.frame' में एक छोटा सा परिवर्तन करने के बाद मेट्रिक्स के कोड की पहली पंक्ति आज़माएं:' d $ blah <- 11: 20'। अब, 'dcast' या' xtabs' के साथ ऐसा करने का प्रयास करें। 'Dcast' के साथ, आपके डेटा को पहले पिघलने के बाद समान आउटपुट संभव होगा। 'Xtabs' के साथ आपको अलग-अलग चर को फिर से बदलना होगा और उन्हें एक साथ' cbind 'करना होगा। और 'reshape()' बहुत तेज़ है, खासकर 'dcast' के वर्तमान कार्यान्वयन की तुलना में। – A5C1D2H2I1M1N2O1R2T1

+1

मेट्रिक्स: +1, लेकिन फिर से, मुझे नहीं पता कि मैं नाम बदलने की परेशानी पर जाऊंगा या नहीं। इस मामले में, विस्तारित उदाहरण के कारण मैं ऊपर टिप्पणी में वर्णन करता हूं ... – A5C1D2H2I1M1N2O1R2T1

12

आधार से reshape2 पैकेज

> dcast(d, sample~cat, fill=0) 
    sample k l m n o p q r s t 
1  A 1 0 3 0 5 0 7 0 9 0 
2  B 0 2 0 4 0 6 0 8 0 10 

xtabs से उपयोग dcast है एक और विकल्प

> xtabs(count~sample+cat, d) 
     cat 
sample k l m n o p q r s t 
    A 1 0 3 0 5 0 7 0 9 0 
    B 0 2 0 4 0 6 0 8 0 10 

आप उत्पादन पसंद करते हैं एक data.frame हो सकता है, तो कोशिश:

> as.data.frame.matrix(xtabs(count~sample+cat, d)) 
    k l m n o p q r s t 
A 1 0 3 0 5 0 7 0 9 0 
B 0 2 0 4 0 6 0 8 0 10 
+0

वह, यह साफ दिखता है। हालांकि, मुझे उल्लेख करना चाहिए था, मैं मानक (आधार) आर में ऐसा करने का एक तरीका ढूंढ रहा हूं ... (क्योंकि यह मेरे लिए नहीं है)।ऐसा करने का कोई तरीका? (भले ही यह अधिक शामिल है?) – crs

+1

@crs मेरा संपादन देखें, मैंने एक आर बेस समाधान जोड़ा। –

+1

ओह, खूनी एच, बहुत बहुत धन्यवाद !!!! यह बिल्कुल है! मैं अभी तक मतदान नहीं कर सकता, लेकिन अपने दिल को आशीर्वाद दें :) – crs

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