Як перетворити таблицю в кадр даних


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
Rich Scriven

Відповіді:


322

Я вже зрозумів це:

as.data.frame.matrix(mytable) 

робить те, що мені потрібно - мабуть, таблицю потрібно якось перетворити на матрицю, щоб її належним чином перевести в кадр даних. Я знайшов більш детальну інформацію про цю функцію as.data.frame.matrix () для таблиць на випадок надзвичайних ситуацій на блозі Computational Ecology .


31
Або просто as.data.frame(mytable). ( is.matrix(mytable)Покаже , що таблиці дійсно просто одягнені матриці, і as.data.frame.matrixметод , який отримує відправляється , коли as.data.frame()передається матричний аргумент.)
Джош О'Брайен

16
Джош - у прикладі, показаному вгорі, as.data.frame (mytable) не працював - ось чому Віктор задав питання, я думав? Не могли б ви уточнити?
Хізер Старк

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 = list (c ("zone1", "zone2", "zone3", "zone4", "zone5 "," zone6 "," zone7 "," zone8 "," zone9 "," zoneNA ")), class =" table ")> as.data.frame.matrix (out) Помилка в 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))

щоб отримати тибл (тобто кадр даних з деякими незначними варіаціями від базового класу)


залежить від того, що ви хочете працювати з фреймами даних або таблицями
Димитріос Захаратос

-1

Це знецінення

as.data.frame (mytable)

Замість цього використовуйте це

бібліотека ("quanteda")

конвертувати (mytable, в = "data.frame")


1
convertне є частиною нормального розподілу R. Я отримав could not find function "convert"Яку бібліотеку вам потрібно для цього?
Марк Лаката

бібліотека ("quanteda")
Odeyinka Olubunmi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.