2015-03-26 4 views
5

Ich habe immer noch einige Probleme, die Data.table Notation zu verstehen. Kann jemand erklären, warum das Folgende nicht funktioniert?Verwenden von "by-Argument" in "äußeren" data.table zum Filtern "inneren" data.table

Ich versuche Daten in Gruppen unter Verwendung zu klassifizieren. Die Pausen verwendet wird, kann in einem anderen data.table und hängen von der by Argument der äußeren „Daten“ data.table

data <- data.table(A = c(1, 1, 1, 2, 2, 2), 
        DATE = as.POSIXct(c("01-01-2012", "30-05-2015", "01-01-2020", "30-06-2012", "30-06-2013", "01-01-1999"), format = "%d-%m-%Y")) 

breaks <- data.table(B = c(1, 1, 2, 2), 
        BREAKPOINT = as.POSIXct(c("01-01-2015", "01-01-2016", "30-06-2012", "30-06-2013"), format = "%d-%m-%Y")) 

data[, bucket := cut(DATE, breaks[B == A, BREAKPOINT], ordered_result = T), by = A] 

ich das gewünschte Ergebnis kann tun

# expected 
data[A == 1, bucket := cut(DATE, breaks[B == 1, BREAKPOINT], ordered_result = T)] 
data[A == 2, bucket := cut(DATE, breaks[B == 2, BREAKPOINT], ordered_result = T)] 
data 
# A  DATE  bucket 
# 1: 1 2012-01-01   NA 
# 2: 1 2015-05-30 2015-01-01 
# 3: 1 2020-01-01   NA 
# 4: 2 2012-06-30 2012-06-30 
# 5: 2 2013-06-30   NA 
# 6: 2 1999-01-01   NA 

Dank finden, Michael

Antwort

5

das Problem ist, dass cut Faktoren erzeugt und diejenigen, werden nicht korrekt in der data.tableby Operation behandelt (dies ein Fehler ist und sollen gemeldet werden - der Faktor Ebenen sollten genauso gehandhabt werden wie in rbind.data.table oder rbindlist). Eine einfache Lösung, um Ihren ursprünglichen Ausdruck ist zum Charakter konvertieren:

data[, bucket := as.character(cut(DATE, breaks[B == A, BREAKPOINT], ordered_result = T)) 
    , by = A] 
# A  DATE  bucket 
#1: 1 2012-01-01   NA 
#2: 1 2015-05-30 2015-01-01 
#3: 1 2020-01-01   NA 
#4: 2 2012-06-30 2012-06-30 
#5: 2 2013-06-30   NA 
#6: 2 1999-01-01   NA 
+2

Ich denke, es im Zusammenhang mit [# 967] (https://github.com/Rdatatable/data.table/issues/967). – Arun