2012-06-28 66 views
0

兩行之間的差異我有一個時間序列的R - 根據條件

dDate = SEQ(as.POSIXct( 「2012年1月1日」),as.POSIXct(「2012年1月10日「),」day「)
dDate
[1]」2012-01-01 PST「」2012-01-02 PST「」2012-01-03 PST「」2012-01-04 PST「」2012- 01-05 PST「」2012-01-06 PST「」2012-01-07 PST「」2012-01-08 PST「」2012-01-09 PST「 [10]」2012-01-10 PST「

values <- c(F,T,T,T,F,F,T,T,F,F) 
> dframe <- data.frame(time=dDate,values=values) 
> dframe 
    time values 
    1 2012-01-01 FALSE 
    2 2012-01-02 TRUE 
    3 2012-01-03 TRUE 
    4 2012-01-04 TRUE 
    5 2012-01-05 FALSE 
    6 2012-01-06 FALSE 
    7 2012-01-07 TRUE 
    8 2012-01-08 TRUE 
    9 2012-01-09 FALSE 
    10 2012-01-10 FALSE 

我想知道這些值爲真的時間間隔?

Expected Result 
    StartTime   Diff(day) 
    2012-01-02   3 
    2012-01-07   2 

回答

1

你可以這樣做:

with(dframe, data.frame(StartTime = time[diff(c(FALSE, values)) == 1], 
         Days = with(rle(values), lengths[values]))) 

的nameing是有點可惜。 valueslengths[values]不是您的values列,而是rle對象的values元素。

1

這個怎麼樣?

> secsPerDay <- 24 * 60 * 60 
> switch  <- c(NA, diff(values)) 
> startTime <- dDate[switch==1] 
> endTime <- dDate[switch==-1] 
> period  <- (as.numeric(endTime) - as.numeric(startTime))/secsPerDay 
> result  <- data.frame(startTime=startTime[-1], period=period[-1]) 
+0

我喜歡你的解決方案,但它不起作用,如果值< - c(T,T,T,T,F,F,T,T,F,F)。在計算開關之前追加False值將會起作用。 – 2sb