কোনও টেবিলকে কীভাবে ডেটা ফ্রেমে রূপান্তর করতে হয়


167

আমার কাছে আর এর একটি টেবিল রয়েছে 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
রিচ স্ক্রিভেন

উত্তর:


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))। @ এক্সএক্স থেকে উদাহরণ ব্যবহার করে:

> 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 = 1208160L, জোন 2 = 1126841 এল, জোন 3 = 2261808L, জোন 4 = 1827557L, জোন 5 = 1038999 এল, জোন 6 = 353569L, জোন 7 = 351484 এল, জোন 8 = 441930 এল, জোন 9 = 25266 এল, জোনএনএ = 14751 এল), .ডিম = 10 এল, .পরিচয় = তালিকা (সি ("জোন 1", "জোন 2", "জোন 3", "জোন 5" "," জোন 6 "," জোন 7 "," জোন 8 "," জোন 9 "," জোনএনএ ")), শ্রেণি =" টেবিল ")> as.data.frame.matrix (আউট) ডি এর ত্রুটি [[2L]]: সীমা ছাড়াই সাবস্ক্রিপ্ট
cmbarbu

11

সংক্ষিপ্ত উত্তর: 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

7

আপনি যদি পরিপাটি ব্যবহার করে থাকেন তবে আপনি এটি ব্যবহার করতে পারেন

as_data_frame(table(myvector))

একটি গোলমাল পেতে (যেমন বেস বর্গ থেকে কিছু ছোট পরিবর্তন সহ একটি ডেটা ফ্রেম)


আপনি ডেটাফ্রেম বা টিবলগুলি নিয়ে কী কাজ করতে চান তার উপর নির্ভর করে
দিমিত্রিওস জাচারাটোস

-1

এটি বর্ণনামূলক

as.data.frame (mytable)

পরিবর্তে এটি ব্যবহার করুন

রূপান্তর (mytable, = "ডেটাফ্রেম")


1
convertসাধারণ আর বিতরণের অংশ নয়। এর could not find function "convert"জন্য আপনার কোন লাইব্রেরি দরকার?
লাকাতা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.