2011-09-27 21 views
9

Zaman aralıklı bir pencere uygulamak istediğim düzensiz bir zaman serimiz var (R numaralı xts). Örneğin, aşağıdaki gibi bir zaman serisi verilen, ben 2009-09-22 00:00:00 başlayarak her ayrık 3 saatlik penceresinde kaç gözlemler gibi şeyler hesaplamak istiyorum:Düzensiz zaman dizileri üzerinde düzenli analiz

library(lubridate) 
s <- xts(c("OK", "Fail", "Service", "OK", "Service", "OK"), 
     ymd_hms(c("2009-09-22 07:43:30", "2009-10-01 03:50:30", 
        "2009-10-01 08:45:00", "2009-10-01 09:48:15", 
        "2009-11-11 10:30:30", "2009-11-11 11:12:45"))) 

Ben görünüşte kullanamaz period.apply() veya split() Bunu yapmak için, çünkü gözlemler olmadan süreleri çıkartacaklar ve bunu bir başlangıç ​​zamanı veremem.

basit sayma problemi (gerçi, elbette, benim gerçek görevler her segmentte daha karmaşıktır!) Bir defada 3 gün toplanan eğer böyle bir şey olurdu Benim istenen çıkışı:

2009-09-22 1 
2009-09-25 0 
2009-09-28 0 
2009-10-01 3 
2009-10-04 0 
2009-10-07 0 
2009-10-10 0 
2009-10-13 0 
2009-10-16 0 
2009-10-19 0 
2009-10-22 0 
2009-10-25 0 
2009-10-28 0 
2009-10-31 0 
2009-11-03 0 
2009-11-06 0 
2009-11-09 2 

Herhangi bir rehberlik için teşekkürler.

cevap

11

s dizini, ilgilendiğiniz süreler içine koymak için kullanın. Daha sonra her 3 saatlik pencerenin uzunluğunu bulmak için period.apply kullanın. Ardından, istediğiniz tüm dizin değerlerine sahip boş bir xts nesnesiyle birleştirin.

# align index into 3-hour blocks 
a <- align.time(s, n=60*60*3) 
# find the number of obs in each block 
count <- period.apply(a, endpoints(a, "hours", 3), length) 
# create an empty xts object with the desired index 
e <- xts(,seq(start(a),end(a),by="3 hours")) 
# merge the counts with the empty object and fill with zeros 
out <- merge(e,count,fill=0) 
+0

Bu benim aradığım şeyi yapmaz - orijinal soruya daha fazla ayrıntı eklememe izin verin. –

+0

Belki de 'merge()' fikri, ihtiyacım olan şey olsa da, istenen aralık bitiş noktalarım ile bir dizi oluşturmak ve sonra bunları diziye eklemek? –

+0

@KenWilliams: Doğru yoldasınız. Cevabımı güncelledim ... –

İlgili konular