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

139

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

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

При поиске я был удивлен, насколько сложно было найти похожий вопрос по SO. Вот один из них:stackoverflow.com/questions/5855225/…  Это довольно простой маневр, описанный в?xtabs (не обязательно это самое очевидное место.) 42-
Уверен, все, что вам нужно сделать, это установитьdeparse.level = 0 (или, возможно, 2) в вызовеtable Rich Scriven

Ваш Ответ

4   ответа
263

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

as.data.frame.matrix(mytable) 

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededas.data.frame(mytable). (is.matrix(mytable)Error: User Rate Limit Exceededas.data.frame.matrixError: User Rate Limit Exceededas.data.frame()Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededrow.namesError: User Rate Limit Exceededrow.namesError: User Rate Limit Exceededas.data.frame.matrixError: User Rate Limit Exceededrow.namesError: User Rate Limit Exceeded
Error: User Rate Limit Exceededas.data.frame.tableError: User Rate Limit Exceededas.data.frame.matrix.
6

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

as_data_frame(table(myvector))

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

11

поскольку имена столбцов являются числами, я использовал другой способ.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 не будут добавлены к передней части.

9

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

Похожие вопросы