Как преобразовать таблицу во фрейм данных


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
Рич Скривен

Ответы:


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
@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", "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))

получить тиббл (т. е. фрейм данных с некоторыми незначительными отклонениями от базового класса)


зависит от того, что вы хотите работать с кадрами данных или Tibbles
Dimitrios Zacharatos

-1

Это dericate

as.data.frame (туЬаЫе)

Вместо этого используйте это

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

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


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

библиотека ("quanteda")
Odeyinka Olubunmi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.