如何检查条件下的值是否在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