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

У меня есть таблица в 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

Я, вероятно, принципиально не понимаю, как таблицы относятся к кадрам данных.

Ответ 1

Я уже понял это:

as.data.frame.matrix(mytable) 

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

Ответ 2

Короткий ответ: используя 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

Ответ 3

Пока результаты меняются в этом случае, потому что имена столбцов являются числами, другой способ, который я использовал, - data.frame(rbind(mytable)). Используя пример из @X.X:

> 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 не будет добавляться к ним спереди.

Ответ 4

Если вы используете tidyverse, вы можете использовать

as_data_frame(table(myvector))

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