R:定义连续值的起始条件

R: Define starting condition for continous value

我正在尝试设置两个新变量以合并到现有 data.frame 中,如果满足关于data.frame 中的 ID。所以 data.frame 的结构与此类似:

ID   Var1
1     0
1     2 
1     5
1     12
2     0
2     2 
2     NA
2     11

我想去:

ID  Var1   start   stop
1    0       0      0
1    2       0      1
1    5       1      2
1    12      2      3
2    0       0      0
2    2       0      1
2    NA      1      2
2    11      2      3

Start 应该是一个 运行 值,第一次 Var1 > 0 启动一次,停止应该以相同的方式运行。 Start的起始值应该是0,stop的起始值应该是1。它应该进一步继续运行,如果Var1在[的过程中再次出现NA0 =24=]。我已尝试执行以下操作:

df %>%
  group_by(ID) %>%
  mutate(stop = ifelse(Var1 > 0, 
  0:nrow(df), 0))

但是它returns的变量不是以0开头的,而是以第一个满足条件的行号开始的。

抱歉,我不会说 dplyr,但您可以轻松地调整它,因为 data.table 仅用于 group-by。

DF <- read.table(text = "ID   Var1
1     0
1     2 
1     5
1     12
2     0
2     2 
2     NA
2     11", header = TRUE)

foo <- function(x) {
  #quantify leading zeros:
  x[is.na(x)] <- 0
  lead0 <- cumsum(x > 0) 
  nlead0 <- sum(lead0 == 0)
  
  #create result using sequence:
  list(c(rep.int(0, nlead0), sequence(length(x) - nlead0) - 1),
       c(rep.int(0, nlead0), sequence(length(x) - nlead0)))
}

library(data.table)
setDT(DF)
DF[, c("start", "stop") := foo(Var1), by = ID]
#   ID Var1 start stop
#1:  1    0     0    0
#2:  1    2     0    1
#3:  1    5     1    2
#4:  1   12     2    3
#5:  2    0     0    0
#6:  2    2     0    1
#7:  2   NA     1    2
#8:  2   11     2    3

这里是使用 ave + replace

的基础 R 选项
transform(df,
  Start = ave(ave(replace(Var1, is.na(Var1), 0) > 0, ID, FUN = cumsum) > 0, ID, FUN = function(x) cumsum(c(0, x))[-(length(x) + 1)]),
  Stop = ave(ave(replace(Var1, is.na(Var1), 0) > 0, ID, FUN = cumsum) > 0, ID, FUN = cumsum)
)

transform(df,
  Start = ave(ave(ave(replace(Var1, is.na(Var1), 0) > 0, ID, FUN = cumsum), ID, FUN = cumsum) > 1, ID, FUN = cumsum),
  Stop = ave(ave(replace(Var1, is.na(Var1), 0) > 0, ID, FUN = cumsum) > 0, ID, FUN = cumsum)
)

这给出了

  ID Var1 Start Stop
1  1    0     0    0
2  1    2     0    1
3  1    5     1    2
4  1   12     2    3
5  2    0     0    0
6  2    2     0    1
7  2   NA     1    2
8  2   11     2    3