टेबल को डाटा फ्रेम में कैसे बदलें


167

मेरे पास R में एक मेज है 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
खोज करते समय मुझे आश्चर्य हुआ कि एसओ पर एक समान प्रश्न खोजना कितना कठिन था। यहाँ एक है: stackoverflow.com/questions/5855225/… यह एक बहुत ही बुनियादी पैंतरेबाज़ी है और इसमें वर्णित है ?xtabs(जरूरी नहीं कि यह सबसे स्पष्ट स्थान हो।)
IRTFM

यकीन है कि तुम सब करने की जरूरत है सेट कर दिया जाता deparse.level = 0करने के लिए (या संभवतः 2) कॉल मेंtable
रिच Scriven

जवाबों:


322

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

as.data.frame.matrix(mytable) 

मुझे क्या चाहिए - जाहिरा तौर पर, तालिका को किसी तरह मैट्रिक्स में परिवर्तित किया जाना चाहिए ताकि डेटा फ्रेम में उचित रूप से अनुवाद किया जा सके। मुझे कम्प्यूटेशनल इकोलॉजी ब्लॉग पर आकस्मिक तालिकाओं के लिए इस as.data.frame.matrix () फ़ंक्शन पर अधिक विवरण मिला ।


31
या बस as.data.frame(mytable)। ( is.matrix(mytable)पता चलता है कि तालिकाओं को वास्तव में सिर्फ मैट्रिस पहना as.data.frame.matrixजाता है , और यह विधि है जो as.data.frame()मैट्रिक्स तर्क पारित होने पर भेज दी जाती है।)
जोश ओ'ब्रायन

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

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

3
बहुत अच्छा लगा। केवल एक चीज मैं नापसंद है कि मेरे xtab कारकों (पहले "कॉलम") में बारी row.names। मैंने row.namesमानों का उपयोग करते हुए एक कॉलम जोड़ने में कामयाबी हासिल की है, लेकिन मैं पहली बार में as.data.frame.matrixलिखने row.namesसे रोकता हूं ..
थिएमे हनिस

as.data.frame.matrix(table(x))मुझे देता है Error in seq_len(ncols) : argument must be coercible to non-negative integer, जबकि as.data.frame(table(x))काम करता है, जहां xसिर्फ एक संख्यात्मक वेक्टर हैc(1,2,...)
पैट्रिकटी

16

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

> 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उनके सामने जोड़ नहीं दिया जाएगा।


यह वास्तव में मेरे उदाहरण में as.data.frame.matrix की तुलना में बेहतर काम कर रहा है जो त्रुटि देता है: आउट <- संरचना (सी (ज़ोन 1 = 1208160 एल, ज़ोन 2 = 1126841 एल, ज़ोन 3 = 2261808 एल, ज़ोन 4 = 1827557 एल, ज़ोन 5 = 1038999 एल, ज़ोन 6) = 353569L, ज़ोन 7 = 351484L, ज़ोन 8 = 441930L, ज़ोन 9 = 25266L, ज़ोन = 14751L), .Dim = 10L, .Dimnames = सूची (c ("ज़ोन 1", "ज़ोन 2", "ज़ोन 3", "ज़ोन 4", "ज़ोन 5")। "," ज़ोन 6 "," ज़ोन 7 "," ज़ोन 8 "," ज़ोन 9 "," ज़ोन ""), क्लास = "टेबल")> as.data.frame.matrix (आउट) डी [[2L]] में त्रुटि। सीमा से बाहर की सदस्यता
cmbarbu

11

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

दीर्घ उत्तर: फ़ंक्शन 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

7

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

as_data_frame(table(myvector))

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


डेटाफ़्रेम या टिब्बल्स के साथ आप क्या काम करना चाहते हैं, इस पर निर्भर करता है
दिमित्रीज़ ज़ाचराटोस

-1

यह वंचित है

as.data.frame (mytable)

इसके बजाय इसका उपयोग करें

पुस्तकालय ( "quanteda")

कन्वर्ट (मेरे लिए, = से "data.frame")


1
convertसामान्य आर वितरण का हिस्सा नहीं है। मुझे मिल गया could not find function "convert"कि इसके लिए आपको कौन सी लाइब्रेरी चाहिए?
निशान लता

पुस्तकालय ( "quanteda")
Odeyinka Olubunmi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.