2012-05-25 9 views
101

ich eine Tabelle in R haben, die str() dies hat:Wie eine Tabelle einen Datenrahmen konvertieren

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" 

Und das sieht aus wie wenn ich es drucken:

    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 

Ich möchte loswerden der x und y und konvertieren Sie es in einen Datenrahmen, der genau so aussieht wie oben (drei Zeilen, vier Spalten), aber ohne die x oder y. Wenn ich as.data.frame(mytable) verwenden, anstatt das ich bekommen:

    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 

ich wahrscheinlich im Grunde nicht verstehen, wie Tabellen-Datenrahmen beziehen.

+2

Bei der Suche war ich überrascht, wie schwierig es war, eine ähnliche Frage zu SO zu finden. Hier ist einer: http: //stackoverflow.com/questions/5855225/generate-a-vector-in-r-and-insert-it-in-a-stacked-frame Es ist ein ziemlich einfaches Manöver und beschrieben in '? Xtabs' (nicht das ist notwendigerweise der naheliegendste Ort.) –

+0

Ziemlich sicher alles, was Sie tun müssen, ist 'deparse.level = 0' (oder möglicherweise 2) im Aufruf von' table' –

Antwort

205

Habe ich es schon aus:

as.data.frame.matrix(mytable) 

tut, was ich brauche - offenbar, muss die Tabelle irgendwie an eine Matrix, um umgewandelt werden in geeigneter Weise in einen Datenrahmen umgesetzt zu werden. Ich habe mehr Details zu diesem as.data.frame.matrix() function for contingency tables at the Computational Ecology blog gefunden.

+26

Oder nur 'as.data.frame (mein Tisch) '. ('is.matrix (mytable)' wird zeigen, dass Tabellen wirklich nur verkleidete Matrizen sind, und 'as.data.frame.matrix' ist die Methode, die ausgelöst wird, wenn' as.data.frame() 'an eine Matrix übergeben wird Argument.) –

+11

Josh - in dem oben gezeigten Beispiel, as.data.frame (mytable) funktionierte nicht - deshalb stellte Victor die Frage, dachte ich? Könnten Sie das klären? –

+3

@HeatherStark Ich vermute, dass dies daran liegt, dass tatsächlich "as.data.frame.table" gesendet wird, und nicht die weniger spezifische 'as.data.frame.matrix'. – jbaums

5

Kurze Antwort: mit as.data.frame.matrix(mytable), wie @Victor Van Hee vorgeschlagen.

Lange Antwort: as.data.frame(mytable) funktioniert möglicherweise nicht bei Kontingenztabellen, die von table() Funktion generiert werden, auch wenn is.matrix(your_table)TRUE zurückgibt. Es wird noch schmelzen Sie Tabelle in das Format factor1 factor2 factori counts.

Beispiel:

> 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 
2

Wenn Sie die tidyverse verwenden, können Sie

as_data_frame(table(myvector)) 

verwenden, um einen tibble (dh einen Datenrahmen mit einigen geringfügigen Abweichungen von der Basisklasse) zu bekommen

4

Während die Ergebnisse in diesem Fall variieren, weil die Spaltennamen Zahlen sind, ist eine andere Art, die ich verwendet habe, data.frame(rbind(mytable)). Am Beispiel von @ 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 

Wenn die Spaltennamen mit Zahlen nicht starten, wird die X nicht auf den vor ihnen noch hinzukommen.

Verwandte Themen