r - 在 R 中按组检查重叠开始和结束时间

标签 r data.table lag shift

我想检查数据的重叠,这里是数据

ID <- c(rep(1,3), rep(3, 5), rep(4,4),rep(5,5))
Begin <- c(0,2.5,3,7,8,7,25,25,10,15,17,20,1,NA,10,11,13)
End <- c(1.5,3.5,6,12,8,11,29,35, 12,19,NA,28,5,20,30,20,25)
df <- data.frame(ID, Begin, End)
df
   ID Begin  End
1   1   0.0  1.5
2   1   2.5  3.5
3   1   3.0  6.0*
4   3   7.0 12.0
5   3   8.0  8.0*
6   3   7.0 11.0*
7   3  25.0 29.0
8   3  25.0 35.0*
9   4  10.0 12.0
10  4  15.0 19.0
11  4  17.0   NA*
12  4  20.0 28.0
13  5   1.0  5.0
14  5    NA 20.0
15  5  10.0 30.0
16  5  11.0 20.0*
17  5  13.0 25.0*

* 表示重叠:

  • 对于第 3 行,ID = 1,Begin=3.0 小于 3.5,因此设置 Begin_New = 3.5,但是
  • 虽然ID = 3,但不一样,第5行Begin = 8.0小于12.0,我们设置Begin_New = 12,但它继续下去,如果我们比较Begin = 7.0和End = 8.0,这是不正确的,因为现在End是 12 是更高的下一个值。

这是我的输出设计

   ID Begin  End Begin_New1
1   1   0.0  1.5        0.0
2   1   2.5  3.5        2.5
3   1   3.0  6.0        3.5*
4   3   7.0 12.0        7.0
5   3   8.0  8.0       12.0*
6   3   7.0 11.0       12.0*
7   3  25.0 29.0       25.0
8   3  25.0 35.0       29.0*
9   4  10.0 12.0       10.0
10  4  15.0 19.0       15.0
11  4  17.0   NA       19.0*
12  4  20.0 28.0       20.0
13  5   1.0  5.0        1.0
14  5    NA 20.0         NA
15  5  10.0 30.0       20.0*
16  5  11.0 20.0       30.0*
17  5  13.0 25.0       30.0*

当我使用这段代码时,我没有得到我想要的输出,它只移动 1 行并比较每一行

setDT(df)[, Begin_New := shift(End), by = ID][!which(Begin < Begin_New), Begin_New:= Begin]
    ID Begin  End Begin_New
 1:  1   0.0  1.5       0.0
 2:  1   2.5  3.5       2.5
 3:  1   3.0  6.0       3.5
 4:  3   7.0 12.0       7.0
 5:  3   8.0  8.0      12.0
 6:  3   7.0 11.0       8.0
 7:  3  25.0 29.0      25.0
 8:  3  25.0 35.0      29.0
 9:  4  10.0 12.0      10.0
10:  4  15.0 19.0      15.0
11:  4  17.0   NA      19.0
12:  4  20.0 28.0      20.0
13:  5   1.0  5.0       1.0
14:  5    NA 20.0        NA
15:  5  10.0 30.0      20.0
16:  5  11.0 20.0      30.0
17:  5  13.0 25.0      20.0

这是我不想要的输出

最佳答案

我认为你的代码非常正确,你只需要使用cummax:

df[, Begin_New := {
  high_so_far = shift(cummax(End), fill=Begin[1L])
  w           = which(Begin < high_so_far)
  Begin[w]    = high_so_far[w]

  Begin
}, by=ID]

关于r - 在 R 中按组检查重叠开始和结束时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39049695/

相关文章:

地理信息系统 : find borders between polygons

r - 在 for 循环内增长列表会返回 NA

r - 无法访问用于生成动态 Shiny 内容的函数内部的 react 对象

r - 使用try语句的data.table和错误处理

r - R 中的 3 列数据表

jQuery 视差效果和滞后

android - 为什么游戏结束画面滞后?

r - 如何根据 tidy data.frame 提供的值在 ggplot 中的标题中添加文本

JavaScript 鼠标移动导致延迟?

用最新的非 NA 值替换 NA