2015-03-26 9 views
5

Nadal mam pewne problemy ze zrozumieniem notacji data.table. Czy ktoś może wyjaśnić, dlaczego poniższe nie działa?Użycie argumentu "by-argument" w "zewnętrznym" pliku data.table do filtrowania "wewnętrznych" danych.tabela

Próbuję sklasyfikować daty w grupy za pomocą cut. Przerwy stosowane można znaleźć w innym data.table i zależą od by argumentu zewnętrznych „dane” 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] 

mogę uzyskać pożądany wynik robi

# 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 

Dzięki, Michael

Odpowiedz

5

problemem jest to, że cut produkuje czynniki i te, które nie są prawidłowo obsługiwane w operacji data.tableby (jest to błąd i powinny być zgłaszane - współczynnik poziomy powinny być traktowane w ten sam sposób, w jaki są obsługiwane w rbind.data.table lub lub). Łatwo naprawić do oryginalnej wypowiedzi jest konwersja do znaku:

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

myślę, że to jest związane z [# 967] (https://github.com/Rdatatable/data.table/issues/967). – Arun