วิธีแปลงตารางเป็น data frame


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
เมื่อค้นหาฉันรู้สึกประหลาดใจที่ยากที่จะพบคำถามที่คล้ายกันเกี่ยวกับ SO นี่คือหนึ่งใน: 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()ผ่านการโต้แย้งเมทริกซ์)
Josh O'Brien

16
Josh - ในตัวอย่างที่แสดงที่ด้านบน as.data.frame (mytable) ไม่ทำงาน - นั่นเป็นเหตุผลที่วิกเตอร์ถามคำถามฉันคิดว่า? คุณช่วยอธิบายได้ไหม
Heather Stark

4
@HeatherStark ฉันสงสัยว่านี้เป็นเพราะในความเป็นจริงที่จะถูกส่งไปมากกว่าที่เฉพาะเจาะจงน้อยas.data.frame.table as.data.frame.matrix
jbaums

3
หาดีมาก สิ่งเดียวที่ผมไม่ชอบคือว่าปัจจัย xtab ของฉัน (ครั้งแรก "คอลัมน์") row.namesกลายเป็น ฉันจัดการเพื่อเพิ่มคอลัมน์โดยใช้row.namesค่า แต่ฉันค่อนข้างป้องกันas.data.frame.matrixการเขียนrow.namesในสถานที่แรก ..
Thieme Hennis

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,...)
PatrickT

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 ในตัวอย่างของฉันที่ส่งคืนข้อผิดพลาด: out <- โครงสร้าง (c (zone1 = 1208160L, zone2 = 1126841L, zone3 = 2261808L, zone4 = 1827557L, zone5 = 1038999L, zone6 = 353569L, zone7 = 351484L, zone8 = 441930L, zone9 = 25266L, zoneNA = 14751L), .Dim = 10L, .Dimnames = รายการ (c ("zone1", "zone2", "zone4", "zone3", "zone2" "," zone6 "," zone7 "," zone8 "," zone9 "," zoneNA ")), class =" table ")> as.data.frame.matrix (ออก) ข้อผิดพลาดใน d [[2L]]: ตัวห้อยออกนอกขอบเขต
cmbarbu

11

คำตอบสั้น ๆ : แนะนำให้ใช้as.data.frame.matrix(mytable)@Victor Van Hee

คำตอบยาว: 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 (เช่น data frame ที่มีการเปลี่ยนแปลงเล็กน้อยจากคลาสพื้นฐาน)


ขึ้นอยู่กับสิ่งที่คุณต้องการทำงานกับ dataframes หรือ tibbles
Dimitrios Zacharatos

-1

นี่เป็นคำบรรยาย

as.data.frame (mytable)

ใช้สิ่งนี้แทน

ห้องสมุด ( "quanteda")

แปลง (mytable, ถึง = "data.frame")


1
convertไม่ได้เป็นส่วนหนึ่งของการแจกแจง R ปกติ ฉันได้could not find function "convert"ห้องสมุดอะไรที่คุณต้องการสำหรับสิ่งนี้
Mark Lakata

library ("quanteda")
Odeyinka Olubunmi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.