2013-08-22 12 views
8

So cheè not the preferred way per creare una tabella di frequenza come data.table. Ma supponiamo di avere un table, per qualsiasi motivo, che voglio convertire in un data.table. La conversione data.table non funziona allo stesso modo la conversione data.frame fa:data.table della tabella è molto diversa da data.frame della tabella

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

data.frame converte i dati in un tabledata.frame, mentre data.table tentativi per memorizzare il table oggetto originale come colonna. (Ho provato questo con tab <- table(1:n) per più valori di n, tra gli altri esempi.)

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

Si noti inoltre che mentre as.data.frame funziona allo stesso modo come data.frame, as.data.table fallisce del tutto:

> 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 quello che sembra essere un problema molto strettamente correlato, se il tavolo è sufficientemente grande (test informale suggerisce .Dim > 100), ottengo errori molto strani quando provo a 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] 

noti che print(data.table(table(1:100))) non ha un errore, ma visualizza solo una colonna V1, mentre print(data.frame(table(1:100))) ha Var1 e Freq colonne.

Esiste una soluzione migliore di data.table(data.frame(...))? Sto meglio cercando sempre di evitare lo table interamente? Ed è l'errore print causato direttamente da questo, o è qualcosa di più profondo?

+3

Sembra essere un problema con inting (come 'data.table' stampa le prime 5 e 5 righe in basso quando le righe totali sono> 100) ... – Arun

+0

Penso che il problema risieda nel modo in cui' R'makes le tabelle di frequenza come una matrice in cui ogni variabile univoca diventa è propria dimensione, e quella variabile unica è memorizzata come un 'nome'. –

+1

è necessario inviare una richiesta di funzionalità e una segnalazione di bug – eddi

risposta

6

C'è una funzione as.data.frame.table che viene chiamata con data.frame(tbl-object). Converte l'oggetto tabella simile a matrice in un oggetto dati di formato lungo. Sembra che non ci sia ancora una funzione as.data.table.table e probabilmente dovrebbe esserci e sarei d'accordo che dovrebbe comportarsi allo stesso modo del metodo as.data.frame piuttosto che ereditare dalla matrice (che è come sarebbe la tabella di solito ereditano:

> 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 

credo che questo dovrebbe essere una richiesta di funzionalità e non credo che è legato al secondo problema

tua seconda domanda sembra come un insetto Gli data.table autori più prominente @.. MatthewDowle è generalmente abbastanza reattivo e dovresti prendere in considerazione l'invio di un rapporto

+1

dal 2014. c'è il metodo 'as.data.table.table 'disponibile, molto probabilmente verrà aggiornato nel 2017 in (v1.10.2), o verrà aggiunto il nuovo metodo' array'. – jangorecki

+1

Come ho detto.Matt è un fantastico manutentore e Arun è un meraviglioso collaboratore. Molto reattivo e interessato a rendere la loro forcella di R una risorsa in continua evoluzione e miglioramento. Non ero a conoscenza di questi mod e sono felice di sentirne parlare. Avevo provato a usare 'table' nelle chiamate j di data.table e sono rimasto deluso nell'esecuzione. –

Problemi correlati