2016-06-08 32 views
5

Sto utilizzando il pacchetto data.table per completare alcune analisi. Uno dei passaggi che sto prendendo riguarda l'utilizzo della funzione by = per ottenere statistiche aggregate. Tuttavia, gli aggregati devono essere calcolati sui risultati univoci in ciascun sottoinsieme by. Ho utilizzato unique e le chiavi per garantire che ogni gruppo by sia costituito da record distinti. Qualcosa di vagamente come il qui sotto:In data.table di R, come è conservata la chiave di un file data.table in sottoinsiemi con riferimento a .SD?

dt_new <- dt_old[,uFunc_MyFunction(x = unique(.SD)),by = grouping_var] 

ho notato che la chiave .SD sembrava variare in base al set di chiavi per dt_old e la dichiarazione by =. Ovviamente, questo stava avendo un effetto sul fatto che i miei sottoinsiemi risultanti fossero unici o meno.

Volevo ottenere una certa chiarezza, così ho scritto il seguito.

library(data.table) 
set.seed(1554) 
dt_example <- data.table(id = 1:50, 
         site = sample(x = c("A","B","C"), 
             size = 50, 
             replace = TRUE, 
             prob = c(0.4,0.4,0.2)), 
         group = sample(x = c("Eta","Mu","Omicron","Psi"), 
             size = 50, 
             replace = TRUE), 
         team = sample(x = 1:3, 
             size = 50, 
             replace = TRUE, 
             prob = c(0.2,0.3,0.5))) 

setkey(x = dt_example, 
     group, 
     team) 

> dt_example[,as.list(key(.SD)),by = site] 
    site V1 V2 
1: B group team 
2: A group team 
3: C group team 

setkey(x = dt_example, 
     site, 
     group, 
     team) 

> dt_example[,as.list(key(.SD)),by = site] 
Empty data.table (0 rows) of 1 col: site 

Quello che sto cercando di capire perché, nella prima versione, la chiave per .SD è coerente, mentre, nella seconda versione, .SD non aveva la chiave a tutti. Penso che abbia qualcosa a che fare con il fatto che la colonna by = non è inclusa direttamente in .SD, che sta rompendo la chiave, ma volevo confermare la mia logica.

Quindi, la mia domanda è questa: perché il sottoinsieme di una tabella di dati, .SD, non ha alcuna chiave quando una delle colonne che comprende la chiave della tabella di dati padre viene utilizzata come variabile di raggruppamento by?

+1

Questa domanda è in realtà solo un FR. – eddi

+0

@eddi Che cos'è un FR? – TARehman

+0

FR = Richiesta di funzionalità – Jaap

risposta

3

In questo caso, poiché è ordinati per site, group, team, mentre raggruppamento per site, la chiave potrebbe essere mantenuta per group, team l'ordine sarebbe mantenuta. La risposta più semplice è che abbiamo perso questo caso. Potresti per favore presentare un problema con solo un link a questo post?

Come soluzione, è possibile utilizzare l'argomento by nel metodo unique per data.tables per specificare le colonne.

E come Davide ha sottolineato, utilizzando unique(.SD) su ogni gruppo sembra inutile, ma questo è probabilmente per un altro Q.

+0

Registrerò un problema momentaneamente. E sono d'accordo che 'unique (.SD)' è un caso d'uso insolito. Non mi aspetterei nemmeno che fosse "riparato" - era solo curioso di sapere cosa accadesse sotto il cofano. – TARehman

+1

Archiviato su Github nel 1736. https://github.com/Rdatatable/data.table/issues/1736 – TARehman