如何检查条件下的值是否在R中其他条件下的间隔内?

如何检查条件下的值是否在R中其他条件下的间隔内?,r,R,我有以下类型的数据框: Time Behavior Status 16.403 FOR START 26.425 FOR STOP 26.426 NI START 28.460 NI STOP 28.461 FOR START 29.480 TSp POINT 31.298 FOR STOP 31.299 NI START 33.297 NI STOP 33.298 FOR START 34.798

我有以下类型的数据框:

Time    Behavior   Status
16.403  FOR    START
26.425  FOR    STOP
26.426  NI     START
28.460  NI     STOP
28.461  FOR    START
29.480  TSp    POINT
31.298  FOR    STOP
31.299  NI     START
33.297  NI     STOP
33.298  FOR    START
34.798  FOR    STOP

NI和FOR是持久行为:从状态行中的START指示的时间开始,到STOP结束。TSp是一个点事件。 TSp行为可能会出现多次。我需要检查它是否包含在由FOR行为定义的时间间隔中

我尝试了几种不同循环的技术,但是我没有正确地编码。。输出的格式并不重要,可以是真/假向量、数字或其他任何内容


如果有人能帮助我,我将非常感激

给每个间隔一个ID,并根据
状态转换为宽格式

library(data.table)
setDT(df)

df[, id := (1 + (rowid(Behavior) - 1) %/% 2)*(Status != 'POINT')]

ints <- dcast(df[Status != 'POINT'], Behavior + id ~ Status, value.var = 'Time')

ints
#    Behavior id  START   STOP
# 1:      FOR  1 16.403 26.425
# 2:      FOR  2 28.461 31.298
# 3:      FOR  3 33.298 34.798
# 4:       NI  1 26.426 28.460
# 5:       NI  2 31.299 33.297
选项2:子集
df
仅指向点并显示匹配间隔

df[Status == 'POINT'][
  ints, on = .(Time > START, Time < STOP),
  `:=`(i.Behavior = i.Behavior, START = START, STOP = STOP, id = i.id)][]
#     Time Behavior Status id i.Behavior  START   STOP
# 1: 29.48      TSp  POINT  2        FOR 28.461 31.298
df[Status=='POINT'][
整数,开=(时间>开始,时间<停止),
`:=`(i.Behavior=i.Behavior,START=START,STOP=STOP,id=i.id)][]
#时间行为状态id i.行为开始停止
#1:28.461 31.298的29.48 TSp第2点
使用的数据

df <- fread('
Time    Behavior   Status
16.403  FOR    START
26.425  FOR    STOP
26.426  NI     START
28.460  NI     STOP
28.461  FOR    START
29.480  TSp    POINT
31.298  FOR    STOP
31.299  NI     START
33.297  NI     STOP
33.298  FOR    START
34.798  FOR    STOP
')

df这里是另一个
数据表

它使用滚动连接来创建FOR间隔,使用非等连接来查找这些FOR间隔内的点

样本数据

df <- fread('
Time    Behavior   Status
16.403  FOR    START
26.425  FOR    STOP
26.426  NI     START
28.460  NI     STOP
28.461  FOR    START
29.480  TSp    POINT
31.298  FOR    STOP
31.299  NI     START
33.297  NI     STOP
33.298  FOR    START
34.798  FOR    STOP
', key = "Time" )

你好您的示例中所需的输出是什么?用这些信息更新你的问题。格式其实并不重要,如果我只有一个数字就可以了,其他的都可以(我在这之后还有其他转换)。=)
df <- fread('
Time    Behavior   Status
16.403  FOR    START
26.425  FOR    STOP
26.426  NI     START
28.460  NI     STOP
28.461  FOR    START
29.480  TSp    POINT
31.298  FOR    STOP
31.299  NI     START
33.297  NI     STOP
33.298  FOR    START
34.798  FOR    STOP
', key = "Time" )
#create FOR-intervals using a rolling join on FOR-START and FOR-STOP
forInterval <- df[ Behavior == "FOR" & Status == "START", ][
  df[ Behavior == "FOR" & Status == "STOP", ], 
  endTime := i.Time, roll = TRUE 
  ]

#      Time Behavior Status endTime
# 1: 16.403      FOR  START  26.425
# 2: 28.461      FOR  START  31.298
# 3: 33.298      FOR  START  34.798

#check if yout Tsp is within a forInterval using a non-equi join
df[Behavior == "TSp", ][forInterval, 
                        inside_FOR := paste0( i.Time, "-", i.endTime ), 
                        on = .(Time >= Time, Time <= endTime)][]
#     Time Behavior Status    inside_FOR
# 1: 29.48      TSp  POINT 28.461-31.298