Jak przekonwertować tabelę na ramkę danych


167

Mam tabelę w R, która ma str()to:

 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"

I wygląda to tak, kiedy go drukuję:

                    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

Chcę pozbyć się xi yi przekształcić ją w ramce danych, która wygląda dokładnie tak samo jak powyżej (trzech rzędach po cztery kolumny), ale bez xlub y. Jeśli używam as.data.frame(mytable), zamiast tego otrzymuję to:

                    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

Prawdopodobnie zasadniczo nie rozumiem, jak tabele odnoszą się do ramek danych.


2
Podczas wyszukiwania byłem zaskoczony, jak trudno było znaleźć podobne pytanie na SO. Oto jedno: stackoverflow.com/questions/5855225/… To dość podstawowy manewr i opisany w ?xtabs(niekoniecznie jest to najbardziej oczywista lokalizacja).
IRTFM

Jestem prawie pewien, że wszystko, co musisz zrobić, to ustawić deparse.level = 0(lub być może 2) wezwanie dotable
Rich Scriven

Odpowiedzi:


322

Już to rozgryzłem:

as.data.frame.matrix(mytable) 

robi to, czego potrzebuję - najwyraźniej tabelę trzeba jakoś przekonwertować na matrycę, aby została odpowiednio przetłumaczona na ramkę danych. Znalazłem więcej szczegółów na temat tej funkcji as.data.frame.matrix () dla tabel awaryjnych na blogu Computational Ecology .


31
Albo po prostu as.data.frame(mytable). ( is.matrix(mytable)ujawni, że tabele są po prostu upiększonymi macierzami i as.data.frame.matrixjest metodą, która jest wysyłana po as.data.frame()przekazaniu argumentu macierzy.)
Josh O'Brien

16
Josh - w przykładzie pokazanym na górze, as.data.frame (mytable) nie działało - dlatego Victor zadawał to pytanie, pomyślałem? Czy mógłbyś wyjaśnić?
Heather Stark

4
@HeatherStark Podejrzewam, że dzieje się tak dlatego, że w rzeczywistości as.data.frame.tablejest wysyłany, a nie mniej konkretny as.data.frame.matrix.
jbaums

3
bardzo fajne znalezisko. jedyne, co mi się nie podoba, to to, że moje czynniki xtab (pierwsza "kolumna") zamieniają się w row.names. Udało mi się dodać kolumnę za pomocą row.nameswartości, ale raczej nie chcę as.data.frame.matrixpisać row.namesw pierwszej kolejności ..
Thieme Hennis

as.data.frame.matrix(table(x))daje mi Error in seq_len(ncols) : argument must be coercible to non-negative integer, while as.data.frame(table(x))works, gdzie xjest tylko wektor numerycznyc(1,2,...)
PatrickT

16

Chociaż wyniki różnią się w tym przypadku, ponieważ nazwy kolumn są liczbami, inny sposób, którego użyłem, to data.frame(rbind(mytable)). Na przykładzie z @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

Jeśli nazwy kolumn nie zaczynają się cyframi, Xnie zostaną dodane na początku.


To również działa lepiej niż as.data.frame.matrix w moim przykładzie, który zwraca błąd: out <- structure (c (zone1 = 1208160L, zone2 = 1126841L, zone3 = 2261808L, zone4 = 1827557L, zone5 = 1038999L, zone6 = 353569L, strefa7 = 351484L, strefa8 = 441930L, strefa9 = 25266L, strefaNA = 14751L), .Dim = 10L, .Dimnames = lista (c ("strefa1", "strefa2", "strefa3", "strefa4", "strefa5 "," zone6 "," zone7 "," zone8 "," zone9 "," zoneNA ")), class =" table ")> as.data.frame.matrix (out) Błąd w d [[2L]]: indeks poza granicami
cmbarbu

11

Krótka odpowiedź: używanie as.data.frame.matrix(mytable), jak zasugerował @Victor Van Hee.

Długa odpowiedź: as.data.frame(mytable)może nie działać na tabelach awaryjnych generowanych przez table()funkcję, nawet jeśli is.matrix(your_table)zwraca TRUE. Nadal wtopi Cię w stółfactor1 factor2 factori counts format.

Przykład:

> 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

Jeśli używasz tidyverse , możesz użyć

as_data_frame(table(myvector))

aby uzyskać tibble (tj. ramkę danych z niewielkimi odchyleniami od klasy bazowej)


zależy od tego, co chcesz pracować z ramkami danych lub tibbles
Dimitrios Zacharatos

-1

To jest bezwartościowe

as.data.frame (mytable)

Zamiast tego użyj tego

konwertować (mytable, to = "data.frame")


1
convertnie jest częścią normalnego rozkładu R. Mam. could not find function "convert"Jakiej biblioteki potrzebujesz do tego?
Mark Lakata,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.