假设我有一个这样的df,显示五个间隔的开始和结束时间:
x = c(120.485, 326.019, 329.089, 337.564, 337.897, 340.133, 451.142,
456.046, 456.213, 456.847, 458.549, 459.15, 459.416, 459.517,
462.319, 464.788, 469.626, 590.345, 597.985, 598.152, 599.353,
600.421, 601.756, 602.523, 602.857, 603.291, 603.758, 604.926,
605.96, 606.827, 607.161, 608.362, 608.629, 609.764, 610.331,
610.998, 611.098, 611.165, 617.004, 778.896, 781.065, 782.299,
782.9, 783.2, 783.5, 783.934, 785.336, 785.669, 787.771, 789.039,
789.606, 790.207, 791.642, 792.409, 797.714, 1014.59, 1015.29,
1015.69, 1016.13, 1016.83, 1017.1, 1017.26, 1019.1, 1019.36,
1019.5, 1019.83, 1020.77, 1021.2, 1022.4, 1022.8, 1023.14, 1023.84,
1023.94, 1024.44, 1024.97, 1025, 1026.91, 1026.97, 1027.74, 1028.27,
1029.17, 1029.71, 1029.81, 1032.01, 1032.11, 1033.31, 1035.35,
1035.68, 1036.75, 1038.28)
我也有一个时间向量,可能出现在这些区间的内部或外部:
findInterval
我想生成另一个向量,声明向量x的值是否i)在所有区间之外,或者ii)它在哪个区间内。
我考虑过使用y <- c(rbind(df$start, df$end)) #get a vector of start-end-start-end etc times
findInterval(x, y)
并开始这样:
[1] 0 1 1 1 1 2 3 3 3 3 3 3 3 3 3 3 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 7 7 7
[43] 7 7 7 7 7 7 7 7 7 7 7 7 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
[85] 9 9 9 9 9 10
输出如下:
findInterval
我可以处理这个来计算由findInterval
产生的index = 0结果的间隔位置,但这似乎不是最好的方法。还有更好的方法吗?
如果时间与开始或结束时间相同,则应将其视为属于该时间间隔。 <data>
<groups name="Group1"/>
<groups name="Group2"/>
<groups name="Group3"/>
</data>
似乎没有这样做 - 例如。 x的最后一个值是1038.28,但它被认为是在一个新的区间内。我希望它被指定为属于interval = 5。
未出现在间隔中的x值应为NA。
答案 0 :(得分:2)
这是一个想法:
library(data.table)
setDT(df)
df[.(start = x), on="start", roll=Inf][start > end, id := NA_integer_]$id
[1] NA 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 NA 3
[20] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[39] 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5
[58] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
[77] 5 5 5 5 5 5 5 5 5 5 5 5 5 5
我不确定这是否具有所需的输出,因为OP中没有明确给出。