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