Aşağıdaki sorunla karşılaşıyorum: bir data.table içinde örtüşmeyen aralıklarının bir kümesi verildiğinde, aralıklar arasındaki boşlukları bildirin.Verileri kullanarak aralıklar arasındaki boşlukları bulma
Bunu bir kez SQL'de uyguladım, ancak lead işlevi veya gecikme işlevinin olmaması nedeniyle data.table ile uğraşıyorum. Tamlık için, SQL kodu here var. İşlevlerin, data.table sürüm 1.9.5'te uygulandığını biliyorum. changelog tarafından. Yani bu çok fazla birleştirme yapmadan ve gecikme veya kurşun fonksiyonu olmadan data.table ile mümkün mü? Prensip olarak, performans sıkıntı çekmediği sürece birleştirme (aka birleştirmeler) kullanmaya tamamen karşı değilim. Bunun kolay bir uygulama olduğunu düşünüyorum, ancak önceki bitiş zamanımın boşluk tablosunun başlangıç zamanı olarak nasıl “elde edileceğine” karar veremiyorum. Örneğin
:
ID stime etime
1 2014-01-15 10:30:00 2014-01-15 11:00:00
1 2014-01-15 12:00:00 2014-01-16 11:30:00
2 2014-01-15 11:00:00 2014-01-15 12:30:00
2 2014-01-15 12:45:00 2014-01-15 13:30:00
Uyarı:
# The numbers represent seconds from 1970-01-01 01:00:01
dat <- structure(
list(ID = c(1L, 1L, 1L, 2L, 2L, 2L),
stime = structure(c(as.POSIXct("2014-01-15 08:00:00"),
as.POSIXct("2014-01-15 11:00:00"),
as.POSIXct("2014-01-16 11:30:00"),
as.POSIXct("2014-01-15 09:30:00"),
as.POSIXct("2014-01-15 12:30:00"),
as.POSIXct("2014-01-15 13:30:00")
),
class = c("POSIXct", "POSIXt"), tzone = ""),
etime = structure(c(as.POSIXct("2014-01-15 10:30:00"),
as.POSIXct("2014-01-15 12:00:00"),
as.POSIXct("2014-01-16 13:00:00"),
as.POSIXct("2014-01-15 11:00:00"),
as.POSIXct("2014-01-15 12:45:00"),
as.POSIXct("2014-01-15 14:30:00")
),
class = c("POSIXct", "POSIXt"), tzone = "")
),
.Names = c("ID", "stime", "etime"),
sorted = c("ID", "stime", "etime"),
class = c("data.table", "data.frame"),
row.names = c(NA,-6L)
)
dat <- data.table(dat)
Bu sonuçlanır boşluklar gün boyunca eşit olarak rapor edilir.
Burada bir satır eksik değil misiniz yoksa bir şey mi özlüyorum? –
yan not: 'dat <- data.table (dat)' hafıza kaybıdır .. 'setDT (dat) 'yerine kullanın. – Arun
Sanırım bu, önceki Q.'ndaki @ eddi'nin cevabındaki küçük değişikliklerle yapılabilir – Arun