2015-03-26 30 views
5

Hala data.table notasyonunu anlamakta bazı problemlerim var. Aşağıdakilerin neden çalışmadığını açıklayan var mı?"iç" data.table filtrelemek için "dış" data.table içinde "by-argument" kullanma

Tarihleri ​​cut kullanarak gruplara ayırmaya çalışıyorum. kullanılan sonları başka data.table bulunan ve data.table dış "veri" nin by argüman bağlıdır Ben istenen sonuç

# 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 

Teşekkür,

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] 

yapıyor alabilirsiniz

edilebilir Michael

cevap

5

Sorun, cut'un data.tableby işleminde faktörler ürettiği ve bu işlemlerin yapılmadığıdır (bu bir hatadır ve bildirilmelidir) düzeyler, rbind.data.table veya rbindlist'da ele alındıkları gibi ele alınmalıdır. Orijinal ifadesi için kolay düzeltme karakterine dönüştürmek için geçerli:

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

Ben [# 967] (https://github.com/Rdatatable/data.table/issues/967) ile ilgili olduğunu düşünüyorum. – Arun

İlgili konular