2017-05-21 39 views
0

我試圖總結兩個變量之間的時間差,並找到列表的長度。根據特定間隔的切點

我的數據集看起來像這樣。我想要得到他們的差距低於6點的步驟數。

Group Time1 Gap 
A 11:00:00 AM 
A 11:04:00 AM 4:00 
A 11:06:00 AM 2:00 
A 11:08:00 AM 2:00 
A 11:12:00 AM 4:00 
A 11:19:00 AM 7:00 
A 11:26:00 AM 7:00 
A 11:28:00 AM 2:00 
A 11:30:00 AM 2:00 
A 11:32:00 AM 2:00 
A 11:34:00 AM 2:00 
A 11:36:00 AM 2:00 

最終結果應該是這樣;

Group Gap Step 
    A 12:00 4 

如果間隔大於6:00,我不想繼續計算其他步驟。

我用過濾器選項「...%>%filter(gap < 8:00)%>%...」但它沒有工作。我知道切點將把這個列表分成兩個獨立的部分。

樣品DF:

structure(list(Group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L), .Label = "A", class = "factor"), Time1 = structure(1:12, .Label = c("11:00:00 AM", 
"11:04:00 AM", "11:06:00 AM", "11:08:00 AM", "11:12:00 AM", "11:19:00 AM", 
"11:26:00 AM", "11:28:00 AM", "11:30:00 AM", "11:32:00 AM", "11:34:00 AM", 
"11:36:00 AM"), class = "factor"), Gap = structure(c(1L, 3L, 
2L, 2L, 3L, 4L, 4L, 2L, 2L, 2L, 2L, 2L), .Label = c("", "2:00", 
"4:00", "7:00"), class = "factor")), .Names = c("Group", "Time1", 
"Gap"), class = "data.frame", row.names = c(NA, -12L)) 
+0

我還需要找到總時間間隔的時間在這5個步驟。在我的示例df中,總時隙等於第5步差距值! – eabanoz

回答

2

另一種方式通過dplyr

library(dplyr) 

df %>% 
    mutate(Time1 = as.POSIXct(Time1, format = '%H:%M:%S'), step = row_number()-1) %>% 
    filter(Time1 - lag(Time1) > 6) 

# Group    Time1 Gap step 
#1  A 2017-05-21 11:24:00 12:00 5 
+1

'base R'選項是'df < - transform(df,Time1 = as.POSIXct(Time1,format ='%H:%M:%S'),step = seq_len(nrow(df))); 子集(df,diff(Time1)> 6)' – akrun

+0

感謝您的建議@Sotos。實際上,我使用了幾乎相同的腳本來處理我的真實數據框,並給出了錯誤的結果。你可以在這裏看到我的擴展數據框和腳本http://stackoverflow.com/questions/43310503/dplyr-lag-and-difftime-give-wrong-results – eabanoz

2

首先,你需要創建的「步驟」一欄,這僅僅是行數減一。

a %>% 
    mutate(Step=row_number()-1) %>% 

然後,您需要從給定的字符串中提取時間,方法是移除冒號。 str_replace函數是從library(stringr)

mutate(gap = as.numeric(str_replace(Gap, ":", ""))) %>% 

過濾器,僅保留那些間隙大於600,其對應於一個大於"6:00"時間。

filter(gap > 600) %>% 

然後,只保留Group,Gap和Step。

select(Group, Gap, Step) 

你的最終輸出:

> df1 %>% 
+ mutate(Step=row_number()-1) %>% 
+ mutate(gap=as.numeric(str_replace(Gap, ":", ""))) %>% 
+ filter(gap > 600) %>% 
+ select(Group, Gap, Step) 

    Group Gap Step 
1  A 12:00 5 
+0

你也可以將gap定義爲一個difftime對象,'gap = as.difftime(as.character(Gap),format =「%M:%S」)''。 – Lamia

+0

感謝您的建議@ConCave。我試圖實現你的方法,但我無法得到我想要的。你可以檢查這個鏈接http://stackoverflow.com/questions/43310503/dplyr-lag-and-difftime-give-wrong-results擴展數據框架和腳本。 – eabanoz