2017-04-20 99 views
0

我有数据帧如下:如何找到R中两个事件之间的时间差?

time event name 
00:09:45 OUT: abc 
00:09:55 IN:  abc 
03:14:52 OUT: abc 
03:15:02 IN:  abc 
03:37:08 OUT: abc 
03:37:17 IN:  abc 
03:39:17 OUT: abc 
03:39:26 IN:  abc 

我想要计算OUT之间,并且在这样的时间差,我有第二OUT和IN之间10秒第一OUT和IN之间10秒。 有没有可能的方法来做到这一点?

回答

1

可能有很多方式,下面是data.table

df<-read.table(text="time event name 
00:09:45 OUT: abc 
00:09:55 IN:  abc 
03:14:52 OUT: abc 
03:15:02 IN:  abc 
03:37:08 OUT: abc 
03:37:17 IN:  abc 
03:39:17 OUT: abc 
03:39:26 IN:  abc",header=T) 

library(data.table) 
setDT(df) 
df[,id:=rep(1:(length(.I)/2),each=2)] 
dfs<-dcast(df,name+id~event,value.var = "time") 
dfs[,Difference:=difftime(strptime(`IN:`, "%H:%M:%S"),strptime(`OUT:`, "%H:%M:%S"))] 

dfs 
name id  IN:  OUT: Difference 
1: abc 1 00:09:55 00:09:45 10 secs 
2: abc 2 03:15:02 03:14:52 10 secs 
3: abc 3 03:37:17 03:37:08  9 secs 
4: abc 4 03:39:26 03:39:17  9 secs 
+2

如果你用时间作为一个字符而不是因子来读表,例如用'fread' ...'df [,diff(as.ITime(time)),by = rep(1:nrow(df),每个= 2,length.out = nrow(df))]' – Frank

+0

是的,它更优雅:) –

-1
library(dplyr) 

# create data 

df <- structure(list(time = structure(c(0.00677083333333333, 0.00688657407407407, 
             0.135324074074074, 0.135439814814815, 0.150787037037037, 0.150891203703704, 
             0.152280092592593, 0.152384259259259), 
             format = "h:m:s", class = "times"), 
        event = structure(c(2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L), 
             .Label = c("IN:", "OUT:"), class = "factor"), 
        name = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "abc", class = "factor")), class = "data.frame", .Names = c("time", "event", "name"), row.names = c(NA, -8L)) 

# process 

df %>% mutate(diff = time - lag(time)) %>% 
filter(event == "IN:") 
+0

一个选项 - 凡从类'times'come? – Uwe

相关问题