Cum se convertește un tabel într-un cadru de date (Programare, R, Dataframe)

Victor Van Hee a intrebat.

Am un tabel în R care are str() de acest lucru:

 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 arată așa când îl tipăresc:

                    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

Vreau să scap de x și y și să îl convertesc într-un cadru de date care arată exact la fel ca cel de mai sus (trei rânduri, patru coloane), dar fără x sau y. Dacă folosesc as.data.frame(mytable), , în schimb, obțin următorul rezultat:

                    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

Probabil că, în mod fundamental, nu înțeleg cum se raportează tabelele la cadrele de date.

Comentarii

  • Când am căutat am fost surprins de cât de dificil a fost să găsesc o întrebare similară pe SO. Iată una:stackoverflow.com/questions/5855225/… Este o manevră destul de simplă și descrisă în ?xtabs (nu că ar fi neapărat cea mai evidentă locație.) –  > Por IRTFM.
  • Destul de sigur că tot ce trebuie să faceți este să setați deparse.level = 0 (sau, eventual, 2) în apelul la table –  > Por Rich Scriven.
5 răspunsuri
Victor Van Hee

Mi-am dat seama deja:

as.data.frame.matrix(mytable) 

face ceea ce am nevoie – se pare că tabelul trebuie să fie cumva convertit într-o matrice pentru a fi tradus corespunzător într-un cadru de date. Am găsit mai multe detalii în acest sens funcția as.data.frame.matrix() pentru tabelele de contingență pe blogul Computational Ecology.

Comentarii

    33

  • Sau pur și simplu as.data.frame(mytable). (is.matrix(mytable) va arăta că tabelele sunt de fapt doar matrici îmbrăcate, iar as.data.frame.matrix este metoda care este trimisă atunci când as.data.frame() primește un argument matrice). –  > Por Josh O’Brien.
  • 16

  • Josh – în exemplul prezentat în partea de sus, as.data.frame(mytable) nu a funcționat – de aceea am crezut că Victor a pus întrebarea? Ați putea să clarificați? –  > Por Heather Stark.
  • @HeatherStark Bănuiesc că acest lucru se datorează faptului că este de fapt as.data.frame.table care este expediat, mai degrabă decât cel mai puțin specific as.data.frame.matrix. –  > Por jbaums.
  • foarte frumos găsit. singurul lucru care nu-mi place este că factorii mei xtab (prima „coloană”) se transformă în row.names. Am reușit să adaug o coloană folosind row.names valori, dar mai degrabă împiedic as.data.frame.matrix scrierea row.names în primul rând.. –  > Por Thieme Hennis.
  • as.data.frame.matrix(table(x)) îmi dă Error in seq_len(ncols) : argument must be coercible to non-negative integer, , în timp ce as.data.frame(table(x)) funcționează, unde x este doar un vector numeric c(1,2,...) –  > Por PatrickT.
BLT

În timp ce rezultatele variază în acest caz, deoarece numele coloanelor sunt numere, o altă modalitate pe care am folosit-o este data.frame(rbind(mytable)). Folosind exemplul din @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

În cazul în care numele coloanelor nu încep cu numere, se obține X nu va fi adăugat în fața lor.

Comentarii

  • De asemenea, acest lucru funcționează de fapt mai bine decât as.data.frame.matrix în exemplul meu care returnează o eroare: out <- structure(c(zone1 = 1208160L, zone2 = 1126841L, zone3 = 2261808L, zone4 = 1827557L, zone5 = 1038999L, zone6 = 353569L, zone7 = 351484L, zone8 = 441930L, zone9 = 25266L, zoneNA = 14751L), . Dim = 10L, .Dimnames = list( c(„zone1”, „zone2”, „zone3”, „zone4”, „zone5”, „zone6”, „zone7”, „zone8”, „zone9”, „zoneNA”)), class = „table”) > as.data.frame.matrix(out) Error in d[[2L]] : subscript out of bounds –  > Por cmbarbu.
X.X

Răspuns scurt: folosind as.data.frame.matrix(mytable), , așa cum a sugerat @Victor Van Hee.

Răspunsul lung: as.data.frame(mytable) este posibil să nu funcționeze pe tabelele de contingență generate de table() chiar dacă is.matrix(your_table) returnează TRUE. Acesta vă va topi în continuare tabelul în factor1 factor2 factori counts format.

Exemplu:

> 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

Ben

Dacă utilizați tidyverse, , puteți utiliza

as_data_frame(table(myvector))

pentru a obține un tibble (adică un cadru de date cu câteva variații minore față de clasa de bază)

Comentarii

  • depinde de ceea ce doriți să lucrați cu cadre de date sau tibbles –  > Por Dimitrios Zacharatos.
Odeyinka Olubunmi

Acest lucru este depreciat:

as.data.frame(my_table)

În schimb, utilizați acest pachet:

library("quanteda")
convert(my_table, to="data.frame") 

Comentarii

  • convert nu face parte din distribuția normală R. Am obținut could not find function "convert" De ce bibliotecă aveți nevoie pentru acest lucru? –  > Por Mark Lakata.
  • library(„quanteda”) –  > Por Odeyinka Olubunmi.

Tags:,