Ich verwende manchmal die ftable
-Funktion rein für seine Darstellung von hierarchischen Kategorien. Manchmal, wenn die Tabelle groß ist, möchte ich die Tabelle vor der Verwendung weiter unterteilen.Verwenden von Attributen von `ftable` zum Extrahieren von Daten
Sagen wir, wir beginnen mit:
mytable <- ftable(Titanic, row.vars = 1:3)
mytable
## Survived No Yes
## Class Sex Age
## 1st Male Child 0 5
## Adult 118 57
## Female Child 0 1
## Adult 4 140
## 2nd Male Child 0 11
## Adult 154 14
## Female Child 0 13
## Adult 13 80
## 3rd Male Child 35 13
## Adult 387 75
## Female Child 17 14
## Adult 89 76
## Crew Male Child 0 0
## Adult 670 192
## Female Child 0 0
## Adult 3 20
str(mytable)
## ftable [1:16, 1:2] 0 118 0 4 0 154 0 13 35 387 ...
## - attr(*, "row.vars")=List of 3
## ..$ Class: chr [1:4] "1st" "2nd" "3rd" "Crew"
## ..$ Sex : chr [1:2] "Male" "Female"
## ..$ Age : chr [1:2] "Child" "Adult"
## - attr(*, "col.vars")=List of 1
## ..$ Survived: chr [1:2] "No" "Yes"
## NULL
Da es keine dimnames
sind, kann ich nicht Daten in der gleichen Art und Weise extrahieren, dass ich mit einem Objekt, das dimnames
hat. Zum Beispiel gibt es keine Möglichkeit für mich, alle "Kind" -Werte direkt aus den Klassen "1st" und "3rd" zu extrahieren.
Mein derzeitiger Ansatz besteht darin, es in eine table
zu konvertieren, die Extraktion durchzuführen und sie dann wieder in eine ftable
umzuwandeln.
Beispiel:
mytable[c("1st", "3rd"), , "Child", ]
## Error: incorrect number of dimensions
## Only the underlying data are seen as having dims
dim(mytable)
## [1] 16 2
## I'm OK with the "Age" column being dropped in this case....
ftable(as.table(mytable)[c("1st", "3rd"), , "Child", ])
## Survived No Yes
## Class Sex
## 1st Male 0 5
## Female 0 1
## 3rd Male 35 13
## Female 17 14
aber ich mag diesen Ansatz nicht, weil das gesamte Layout manchmal ändert sich, wenn man nicht aufpasst. Vergleichen Sie es mit dem folgenden, die die Anforderung von subsetting nur Kinder entfernt und fügt die Anforderung von subsetting nur diejenigen, die nicht überlebt haben:
ftable(as.table(mytable)[c("1st", "3rd"), , , "No"])
## Age Child Adult
## Class Sex
## 1st Male 0 118
## Female 0 4
## 3rd Male 35 387
## Female 17 89
Ich mag es nicht, dass das gesamte Layout der Zeilen und Spalten geändert hat. Das ist ein klassischer Fall von mit mir erinnern drop = FALSE
zu verwenden Dimensionen zu halten, wenn eine einzelne Säule extrahiert wird:
ftable(as.table(mytable)[c("1st", "3rd"), , , "No", drop = FALSE])
## Survived No
## Class Sex Age
## 1st Male Child 0
## Adult 118
## Female Child 0
## Adult 4
## 3rd Male Child 35
## Adult 387
## Female Child 17
## Adult 89
Ich weiß, es gibt viele Möglichkeiten, um die Daten zu erhalten, die ich will, beginnend mit subsetting aus dem rohen Daten und dann meine ftable
, aber für diese Frage, lassen Sie uns davon ausgehen, dass das nicht möglich ist.
Das Endziel ist es, einen Ansatz zu haben, mit dem ich aus einer ftable
das Anzeigeformat der verschachtelten "Zeile" Hierarchie beibehalten kann.
Gibt es andere Lösungen? Können wir die Attribute row.vars
und col.vars
verwenden, um Daten aus einem ftable
zu extrahieren und seine Formatierung beizubehalten?
Mein aktueller Ansatz funktioniert auch nicht für hierarchische Spalten, daher hoffe ich, dass die vorgeschlagene Lösung auch diese Fälle behandeln kann.
Beispiel:
tab2 <- ftable(Titanic, row.vars = 1:2, col.vars = 3:4)
tab2
## Age Child Adult
## Survived No Yes No Yes
## Class Sex
## 1st Male 0 5 118 57
## Female 0 1 4 140
## 2nd Male 0 11 154 14
## Female 0 13 13 80
## 3rd Male 35 13 387 75
## Female 17 14 89 76
## Crew Male 0 0 670 192
## Female 0 0 3 20
Notiere die Verschachtelung von "Alter" und "überlebt".
meinen aktuellen Ansatz versuchen:
ftable(as.table(tab2)[c("1st", "3rd"), , , , drop = FALSE])
## Survived No Yes
## Class Sex Age
## 1st Male Child 0 5
## Adult 118 57
## Female Child 0 1
## Adult 4 140
## 3rd Male Child 35 13
## Adult 387 75
## Female Child 17 14
## Adult 89 76
Ich kann zurück zu bekommen, was ich will mit:
ftable(as.table(tab2)[c("1st", "3rd"), , , , drop = FALSE], row.vars = 1:2, col.vars = 3:4)
Aber ich bin die Hoffnung, etwas direkter.
Ich bin diese Straße vorher gegangen. Aufgegeben und jetzt unterteile ich die Rohdaten und benutze 'ftable' darauf. –
@ RomanLuštrik, hast du Fortschritte gemacht, die du gerne teilen würdest? Ich mag 'ftable', aber es ist traurig, dass es so vernachlässigt scheint. Es hat nicht einmal eine richtige 'as.data.frame' Methode .... – A5C1D2H2I1M1N2O1R2T1
Soll Ihr Ergebnis die Ausgabe in der Konsole überprüfen oder wollen Sie diese Tabelle für die Verwendung in einem Dokument formatieren? Sind Sie offen für einen alternativen Ansatz, der 'ftable' nicht verwendet? –