Split xts object by event

I have an xts object with several event indicators. I need to break it down into certain events, so that all records from this event until the next event will be stored in the same one xts, eventually creating a list of objects xts, each of which contains the event as the last record without any other events of the same type .

example:

ts = as.Date(Sys.Date()-99:0)
e1 = numeric(100);e1[10*1:10]=1
e2 = numeric(100);e2[15*1:6]=1
y  = 1:100  # just a sample content
xs = as.xts(cbind(e1,e2,y),order.by=ts)

ee = e1*e2==1  # the event in which both e1 and e2 are 1, should happen at 30,60,90

# here should be splitting function that gets xs and ee as parameters
# and should return a list of 4 xts: the first with the entries 1 through 30, 
# the second with entries 31 to 60, the third with entries 61 to 90, and the last
# with entries 91 to 100

Your suggestions will be greatly appreciated.

+5
source share
1 answer

Use cumsum(ee)to create a grouping variable, and then just call split. You should make a small change to the output cumsum, since you want the values ​​to TRUEbe the last observation in the group (and not the first).

split(xs, c(0,head(cumsum(ee),-1)))
split(xs,rev(cumsum(rev(ee))))  # grouping factors reversed
+4
source

All Articles