Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何计算事件多次连续发生的持续时间?_R_Data.table - Fatal编程技术网

R 如何计算事件多次连续发生的持续时间?

R 如何计算事件多次连续发生的持续时间?,r,data.table,R,Data.table,这是我的数据的一个子集 # | Event | Time 1 A 22:00:00 2 B 22:00:10 3 B 22:00:20 4 B 22:00:30 5 C 22:00:40 6 B 22:00:10 7 B 22:00:20 8 B 22:00:30 9

这是我的数据的一个子集

    # | Event | Time
    1    A       22:00:00
    2    B       22:00:10
    3    B       22:00:20
    4    B       22:00:30
    5    C       22:00:40
    6    B       22:00:10
    7    B       22:00:20
    8    B       22:00:30
    9    A       22:00:40
我想计算同一事件连续发生的持续时间–因此,假设我想计算事件B的持续时间,那么输出应该是

    # | Event | Time      | Duration
    1    A       22:00:00   NA
    2    B       22:00:10   20 Secs
    3    B       22:00:20   NA
    4    B       22:00:30   NA
    5    C       22:00:40   NA
    6    B       22:00:10   20 Secs
    7    B       22:00:20   NA
    8    B       22:00:30   NA
    9    A       22:00:40   NA
我尝试了以下几种解决方案: 和

但我似乎无法实现我想要实现的目标。希望我能得到一些帮助!谢谢

我们可以使用data.table。将“data.frame”转换为“data.table”setDTdf1,基于“Event”的运行长度id创建分组变量,即基于相同的相邻元素“grp”,将“Time”转换为POSIXct,按“grp”分组,指定逻辑条件为“i”,事件==B,使用difftime查找最后一个和第一个“Time1”的差异,然后,我们将不是每个“grp”的第一个观察值的“持续时间”的值分配给NA

library(data.table)
setDT(df1)[, grp := rleid(Event)][, Time1 := as.POSIXct(Time, format = 
       "%H:%M:%S")][Event == "B", 
     Duration := as.numeric(difftime(Time1[.N], Time1[1], unit = "secs")), grp]
df1[df1[, .I[seq_len(.N) != 1], grp]$V1, Duration := NA][, c("Time1", "grp") := NULL][]
#   No Event     Time Duration
#1:  1     A 22:00:00       NA
#2:  2     B 22:00:10       20
#3:  3     B 22:00:20       NA
#4:  4     B 22:00:30       NA
#5:  5     C 22:00:40       NA
#6:  6     B 22:00:10       20
#7:  7     B 22:00:20       NA
#8:  8     B 22:00:30       NA
#9:  9     A 22:00:40       NA
数据
尝试librarydata.table;setDTdf1[,grp:=rliedEvent][,Time:=chron::timesTime][Event==B,Duration:=cas.numericmaxTime minTime*24*60*60,repNA,.N-1,grp]Woah它工作了!你能解释一下步骤吗?我对r和数据的使用相当陌生。table@cookiedookie谢谢,我更新了一些描述
df1 <- structure(list(No = 1:9, Event = c("A", "B", "B", "B", "C", "B", 
 "B", "B", "A"), Time = c("22:00:00", "22:00:10", "22:00:20", 
 "22:00:30", "22:00:40", "22:00:10", "22:00:20", "22:00:30", "22:00:40"
 )), .Names = c("No", "Event", "Time"), class = "data.frame", row.names = c(NA, 
-9L))