2016-06-08 8 views
5

Ich verwende das Paket data.table, um einige Analysen durchzuführen. Einer der Schritte, die ich unternehme, beinhaltet die Verwendung der by = Funktion, um aggregierte Statistiken zu erhalten. Die Aggregate müssen jedoch anhand der eindeutigen Ergebnisse in jeder by Teilmenge berechnet werden. Ich habe unique und Schlüssel verwendet, um sicherzustellen, dass jede by Gruppe aus verschiedenen Datensätzen besteht. Etwas vage wie die folgende Liste:Wie wird in der data.table von R der Schlüssel einer data.table in Teilmengen beibehalten, die mit .SD referenziert werden?

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

Ich bemerkte, dass der Schlüssel auf .SD auf der Grundlage der Schlüsselsatz für dt_old und der by = Aussage zu verändern schien. Offensichtlich hatte dies eine Auswirkung darauf, ob meine resultierenden Untermengen eindeutig waren oder nicht.

Ich wollte etwas Klarheit bekommen, also schrieb ich das unten.

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 

Was ich zu verstehen versuchen, ist, warum in der ersten Version der Schlüssel für .SD konsistent ist, während in der zweiten Version .SD gar keinen Schlüssel hatte. Ich denke, es hat etwas damit zu tun, dass die by = Spalte nicht direkt in .SD enthalten ist, die den Schlüssel bricht, aber ich wollte meine Logik bestätigen.

Also meine Frage ist das: Warum hat die Teilmenge einer Datentabelle, .SD, keinen Schlüssel, wenn eine der Spalten, die den Schlüssel der übergeordneten Datentabelle enthält, als by Gruppierungsvariable verwendet wird?

+1

Diese Frage ist wirklich nur eine FR ist. – eddi

+0

@eddi Was ist ein FR? – TARehman

+0

FR = Funktionsanfrage – Jaap

Antwort

3

In diesem Fall, da es nach site, group, team sortiert ist, kann der Schlüssel bei der Gruppierung durch für group, team beibehalten werden, da die Reihenfolge beibehalten würde. Die einfachste Antwort ist, dass wir diesen Fall übersehen haben. Könnten Sie bitte ein Problem mit nur einem Link zu diesem Post einreichen?

Als Umgehung können Sie das by Argument in unique Methode für data.tables verwenden, um die Spalten anzugeben.

Und David wies darauf hin, unique(.SD) scheint auf jede Gruppe mit unnötig, aber das ist wahrscheinlich für eine andere Frage:

+0

Ich werde ein Problem vorübergehend protokollieren. Und ich stimme zu, dass "unique (.SD)" ein ungewöhnlicher Anwendungsfall ist. Ich würde nicht wirklich erwarten, dass es "repariert" wird - war nur neugierig, was unter der Haube passiert ist. – TARehman

+1

archiviert auf Github als 1736. https://github.com/Rdatatable/data.table/issues/1736 – TARehman