2012-05-25 20 views
101

मैं आर में एक टेबल है इस बात का str() है कि करने के लिए एक मेज कन्वर्ट करने के लिए:कैसे एक डेटा फ्रेम

table [1:3, 1:4] 0.166 0.319 0.457 0.261 0.248 ... 
- attr(*, "dimnames")=List of 2 
    ..$ x: chr [1:3] "Metro >=1 million" "Metro <1 million" "Non-Metro Counties" 
    ..$ y: chr [1:4] "q1" "q2" "q3" "q4" 

और इस तरह दिखता है जब मैं प्रिंट यह:

    y 
x       q1  q2  q3  q4 
    Metro >=1 million 0.1663567 0.2612212 0.2670441 0.3053781 
    Metro <1 million 0.3192857 0.2480012 0.2341030 0.1986102 
    Non-Metro Counties 0.4570341 0.2044960 0.2121102 0.1263597 

मैं करना चाहते हैं x और y से छुटकारा पाएं और इसे एक डेटा फ्रेम में परिवर्तित करें जो उपरोक्त (तीन पंक्तियों, चार कॉलम) जैसा बिल्कुल दिखता है, लेकिन x या y के बिना। अगर मैं as.data.frame(mytable) उपयोग करते हैं, बजाय मैं इस मिल:

    x y  Freq 
1 Metro >=1 million q1 0.1663567 
2 Metro <1 million q1 0.3192857 
3 Non-Metro Counties q1 0.4570341 
4 Metro >=1 million q2 0.2612212 
5 Metro <1 million q2 0.2480012 
6 Non-Metro Counties q2 0.2044960 
7 Metro >=1 million q3 0.2670441 
8 Metro <1 million q3 0.2341030 
9 Non-Metro Counties q3 0.2121102 
10 Metro >=1 million q4 0.3053781 
11 Metro <1 million q4 0.1986102 
12 Non-Metro Counties q4 0.1263597 

मैं शायद मौलिक समझ में नहीं आता कि कैसे टेबल डेटा फ्रेम से संबंधित हैं।

+2

खोज करते समय मुझे आश्चर्य हुआ कि SO पर एक समान प्रश्न ढूंढना कितना मुश्किल था। यहां एक है: http: //stackoverflow.com/questions/5855225/generate-a-vector-in-r-and-insert-it-in-a-stacked-frame यह एक सुंदर मूल चालक है और '? Xtabs' में वर्णित है (यह जरूरी नहीं है कि यह सबसे स्पष्ट स्थान है।) –

+0

निश्चित रूप से आपको बस इतना करना है कि 'table' –

उत्तर

205

मैं यह पहले से ही पता लगा:

as.data.frame.matrix(mytable) 

मैं क्या जरूरत है - जाहिरा तौर पर, टेबल उचित रूप से एक डेटा फ्रेम में अनुवाद करने के क्रम में किसी भी तरह एक मैट्रिक्स के लिए परिवर्तित किया जाना चाहिए। मुझे इस as.data.frame.matrix() function for contingency tables at the Computational Ecology blog पर अधिक जानकारी मिली।

+26

पर कॉल में' deparse.level = 0' (या संभवतः 2) सेट करें या बस 'as.data.frame (mytable) '। ('is.matrix (mytable) 'बताएगा कि टेबल वास्तव में सिर्फ मैट्रिक्स तैयार किए गए हैं, और' as.data.frame.matrix' विधि है जो प्रेषित हो जाती है जब' as.data.frame() 'को मैट्रिक्स पास किया जाता है तर्क।) –

+11

जोश - शीर्ष पर दिखाए गए उदाहरण में, as.data.frame (mytable) ने काम नहीं किया - यही कारण है कि विक्टर सवाल पूछ रहा था, मैंने सोचा? क्या आप स्पष्टीकरण दे सकते हैं? –

+3

@ हेदरस्टार मुझे संदेह है क्योंकि यह वास्तव में 'as.data.frame.table' है जिसे कम विशिष्ट' as.data.frame.matrix' के बजाय प्रेषित किया जा रहा है। – jbaums

5

संक्षिप्त उत्तर: as.data.frame.matrix(mytable) का उपयोग करके, @ विक्टर वान हे ने सुझाव दिया।

लांग जवाब: as.data.frame(mytable)table() समारोह द्वारा उत्पन्न आकस्मिक टेबल पर काम नहीं कर सकता है, भले ही is.matrix(your_table) रिटर्न TRUE। यह आपको अभी भी factor1 factor2 factori counts प्रारूप में तालिका पिघलाएगा।

उदाहरण:

> freq_t = table(cyl = mtcars$cyl, gear = mtcars$gear) 

> freq_t 
    gear 
cyl 3 4 5 
    4 1 8 2 
    6 2 4 1 
    8 12 0 2 

> is.matrix(freq_t) 
[1] TRUE 

> as.data.frame(freq_t) 
    cyl gear Freq 
1 4 3 1 
2 6 3 2 
3 8 3 12 
4 4 4 8 
5 6 4 4 
6 8 4 0 
7 4 5 2 
8 6 5 1 
9 8 5 2 
> as.data.frame.matrix(freq_t) 
    3 4 5 
4 1 8 2 
6 2 4 1 
8 12 0 2 
2

आप tidyverse का उपयोग कर रहे हैं, तो आप

as_data_frame(table(myvector)) 

उपयोग कर सकते हैं

(आधार वर्ग से कुछ मामूली बदलाव के साथ यानी एक डेटा फ्रेम) एक tibble पाने के लिए
4

जबकि परिणाम इस मामले में भिन्न होते हैं क्योंकि स्तंभ नाम संख्याएं हैं, मैंने उपयोग किया है एक और तरीका data.frame(rbind(mytable)) है। @ X.X से उदाहरण का उपयोग:

> freq_t = table(cyl = mtcars$cyl, gear = mtcars$gear) 

> freq_t 
    gear 
cyl 3 4 5 
    4 1 8 2 
    6 2 4 1 
    8 12 0 2 

> data.frame(rbind(freq_t)) 
    X3 X4 X5 
4 1 8 2 
6 2 4 1 
8 12 0 2 

स्तंभ नाम संख्या के साथ शुरू नहीं करते हैं, X उनके सामने से नहीं जोड़ा जाएगा।

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