2017-02-07 49 views
1

我是R新手,並且陷入獲取Flag = 1的開始時間和結束時間。條件是,1應該重複(連續)至少4次,然後只需要捕獲其開始和結束時間。我輸入看起來喜歡 -獲取Flag = 1的開始時間和結束時間,如果它重複4次(不使用for循環)

Time Stamp Flag 00:00:00 1 00:00:10 1 00:00:20 1 00:00:30 1 00:00:40 0 00:00:50 0 00:01:00 0 00:01:10 0 00:01:20 0 00:01:30 1 00:01:40 1 00:01:50 1 00:02:00 0 00:02:10 1 00:02:20 1 00:02:30 1 00:02:40 1 00:02:50 1 00:03:00 1 00:03:10 1 00:03:20 1

和我的輸出應該看起來像 -

Start Time End Time Duration 00:00:00 00:00:30 00:00:30 00:02:10 00:03:20 00:01:10

我一直在使用的循環,如果其他人實現它,但由於數據龐大的拍了很多的時間。所以,我需要優化它。

R中有沒有內置函數可以修改和使用?

回答

0

首先使用創建數據:

st <- data.frame(Time = format(seq(from=as.POSIXct("2012-1-1 00:00:00", tz="UTC"), 
            to=as.POSIXct("2012-1-1 00:03:20", tz="UTC"), 
           by="10 secs") , "%H:%M:%S"), 
       Flag = c(1,1,1,1,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1)) 

st$Time <- as.POSIXct(st$Time, format = "%H:%M:%S") 

使用dplyr我會接近這個爲:

st %>% 
mutate(gr = cumsum(lag(Flag, default = Flag[1]) != Flag)) %>% 
filter(Flag == 1) %>% 
group_by(gr) %>% 
filter(length(gr) >= 4) %>% 
summarise(start.time = first(Time), 
      last.time = last(Time)) %>% 
mutate(Duration = last.time - start.time) 

結果是

# A tibble: 2 × 4 
    gr   start.time   last.time Duration 
    <int>    <dttm>    <dttm> <time> 
1  0 2017-06-08 00:00:00 2017-06-08 00:00:30 30 secs 
2  4 2017-06-08 00:02:10 2017-06-08 00:03:20 70 secs 
相關問題