在R中按组检查重叠开始和结束时间(当数据有NA时运行不正确)

BIN*_*BIN 3 r data.table

这是前一个问题的后续问题,但我遇到了一个问题,答案是由于NA:

require(data.table)
ID <- c(rep(1,4), rep(3, 5), rep(4,4),rep(5,5))
Begin <- c(0,2.5,NA,3,7,8,7,25,25,10,15,0,0,1,NA,10,11,13)
End <- c(1.5,3.5,NA,6,12,8,11,29,35, 12,19,NA,28,5,20,30,20,25)
df <- data.table(ID, Begin, End)
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]
    ID   Begin  End    Begin_New
  1:  1   0.0  1.5       0.0
  2:  1   2.5  3.5       2.5
  3:  1    NA   NA        NA
  4:  1   3.0  6.0       3.0* # <~~ it supposed 3.5
  5:  3   7.0 12.0       7.0
  6:  3   8.0  8.0      12.0
  7:  3   7.0 11.0      12.0
  8:  3  25.0 29.0      25.0
  9:  3  25.0 35.0      29.0
 10:  4  10.0 12.0      10.0
 11:  4  15.0 19.0      15.0
 12:  4   0.0   NA      19.0
 13:  4   0.0 28.0       0.0* # <~~ it's supposed 19.0
 14:  5   1.0  5.0       1.0
 15:  5    NA 20.0        NA
 16:  5  10.0 30.0      20.0
 17:  5  11.0 20.0      30.0
 18:  5  13.0 25.0      30.0
Run Code Online (Sandbox Code Playgroud)

我尝试检查重叠,如果Begin <End,Begin_New需要与每个ID的End previous相等,请继续检查直到Begin> End,但是当我有End of End变量时,代码不明白,继续检查值.我尝试了几个代码,但它不起作用

Fra*_*ank 5

您可以在之前添加另一个步骤cummax:

df[, Begin_New := {
  End[is.na(End)] = 0 # <- new step here
  high_so_far = shift(cummax(End), fill=Begin[1L])
  w = which(Begin < high_so_far)
  Begin[w] = high_so_far[w]
  Begin
}, by=ID][]
Run Code Online (Sandbox Code Playgroud)

我是怎么做到的 为了解决这样的问题,我一次j一步地为一个组运行

df[, if (.GRP == 1L){
  high_so_far = shift(cummax(End), fill=Begin[1L])
  print(high_so_far)
  # w = which(Begin < high_so_far)
  # Begin[w] = high_so_far[w]
  # Begin
}, by=ID][]

# 0.0 1.5 3.5  NA
Run Code Online (Sandbox Code Playgroud)

所以我可以看到这是问题发生的地方,并通过阅读?cummax来查看是否有na.rm选项.没有在那里找到一个,我可以考虑在这个之前或之后我可以采取的其他步骤来获得期望的结果.

如果我在这一步没有找到问题,那么我可以逐渐取消后面的行并添加更多print语句.或者我可以换成.GRP==1其他组.正如@jangorecki所提到的,有适当的调试方法,你也可以尝试:

你也可以放入browser()内部j={...}并以交互方式调查当前状态