2013-08-22 4 views
8

Ich weiß, dass tablenot the preferred way ist, um eine Häufigkeitstabelle als data.table zu machen. Aber angenommen, ich habe eine table, aus welchem ​​Grund auch immer, die ich in eine data.table konvertieren möchte. Die data.table Umwandlung nicht funktioniert auf die gleiche Weise die Umwandlung data.frame tut:data.table der Tabelle ist sehr unterschiedlich zu data.frame der Tabelle

require(data.table) 
tab <- table(1:101) 
DF.tab <- data.frame(tab) 
DT.tab <- data.table(tab) 

data.frame wandelt die Daten in ein tabledata.frame, während data.table Versuche, das ursprüngliche Objekt table als Spalte zu speichern. (Ich habe dies für mehrere Werte von n mit tab <- table(1:n) getestet, unter anderen Beispielen.)

> str(DF.tab) 
'data.frame': 101 obs. of 2 variables: 
$ Var1: Factor w/ 101 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ... 
$ Freq: int 1 1 1 1 1 1 1 1 1 1 ... 
> str(DT.tab) 
Classes ‘data.table’ and 'data.frame': 101 obs. of 1 variable: 
$ tab: 'table' int [1:101(1d)] 1 1 1 1 1 1 1 1 1 1 ... 
    ..- attr(*, "dimnames")=List of 1 
    .. ..$ : chr "1" "2" "3" "4" ... 
- attr(*, ".internal.selfref")=<externalptr> 

Beachten Sie auch, dass, während as.data.frame die gleiche Art und Weise wie data.frame arbeitet, as.data.table nicht ganz:

> as.data.table(tab) 
Error in UseMethod("as.data.table") : 
    no applicable method for 'as.data.table' applied to an object of class "table" 

In Was scheint ein sehr eng verwandtes Problem zu sein, wenn die Tabelle ausreichend groß ist (informelle Tests schlägt .Dim > 100 vor), bekomme ich sehr seltsame Fehler beim Versuch, print:

> print(data.table(table(1:101))) 
Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L, : 
    dims [product 5] do not match the length of object [10] 

Beachten Sie, dass print(data.table(table(1:100))) keinen Fehler haben, zeigt aber nur eine Spalte V1, während print(data.frame(table(1:100)))Var1 und Freq Spalten.

Gibt es eine bessere Problemumgehung als data.table(data.frame(...))? Bin ich besser dran immer zu versuchen, table vollständig zu vermeiden? Und wird der print Fehler direkt dadurch verursacht, oder ist es etwas tiefer?

+3

Es scheint ein Problem mit hübschen pr zu sein inting (wie 'data.table' die obersten 5 und unteren 5 Zeilen ausgibt, wenn die Gesamtzeilen> 100 sind) ... – Arun

+0

Ich denke, das Problem liegt in der Art und Weise, wie' R' Frequenztabellen als Array aufbaut, wo jede einzelne Variable ankommt Es ist eine eigene Dimension und diese eindeutige Variable wird als 'Name' gespeichert. –

+1

sollten Sie eine Feature-Anfrage und einen Fehlerbericht senden – eddi

Antwort

6

Es gibt eine as.data.frame.table Funktion, die mit data.frame(tbl-object) aufgerufen wird. Es konvertiert das matrixartige Tabellenobjekt in ein langformatiges Datenobjekt. Es scheint noch keine as.data.table.table-Funktion zu geben, und es sollte wohl sein, und ich würde zustimmen, dass sie sich genauso verhalten sollte wie die as.data.frame-Methode, anstatt von der Matrix zu übernehmen (wie es die Tabelle wäre) in der Regel erben:

> data.table(matrix(1:10, 2)) 
    V1 V2 V3 V4 V5 
1: 1 3 5 7 9 
2: 2 4 6 8 10 
> data.table(as.table(matrix(1:10, 2))) 
Error in UseMethod("as.data.table") : 
    no applicable method for 'as.data.table' applied to an object of class "table" 
> data.table(as.data.frame(as.table(matrix(1:10, 2)))) 
    Var1 Var2 Freq 
1: A A 1 
2: B A 2 
3: A B 3 
4: B B 4 
5: A C 5 
6: B C 6 
7: A D 7 
8: B D 8 
9: A E 9 
10: B E 10 

ich denke, dies ist ein Feature-request sein sollte, und ich glaube nicht, dass es mit dem zweiten Problem zusammenhängt

Ihre zweite Frage wie ein Bug scheint die data.table Autoren am deutlichsten @.. MatthewDowle ist im Allgemeinen ziemlich reaktionsschnell, und Sie sollten in Betracht ziehen, einen Bericht zu senden.

+1

seit 2014. Gibt es eine 'as.data.table.table' Methode, wird sie wahrscheinlich 2017 in (v1.10.2) aktualisiert, oder eine neue' array' Methode wird hinzugefügt. – jangorecki

+1

Wie ich schon sagte.Matt ist ein fantastischer Betreuer und Arun ein wundervoller Mitwirkender. Sehr reaktionsschnell und daran interessiert, ihre Fork von R zu einer sich entwickelnden und verbessernden Ressource zu machen. Ich war mir dieser Mods nicht bewusst und freue mich, von ihnen zu hören. Ich hatte versucht, 'Tabelle' in data.table J-Calls zu verwenden und war in der Leistung enttäuscht. –

Verwandte Themen