查找连续行中的值

Fio*_*ona 2 for-loop if-statement r

下面给出了我的数据框的示例。

ID     X      
1      1     
2      2      
3      1      
4      0      
5      0      
6      1      
7      4
8      5 
9      6
10     7
11     0 
12     0
Run Code Online (Sandbox Code Playgroud)

我想对其应用逻辑,查看 3 个或更多连续行中的值是否 >0。如果他们这样做,我想在另一栏中标记他们。因此,输出将如下所示。

ID     X      Y
1      1      1
2      2      1
3      1      1
4      0      0
5      0      0
6      1      1
7      4      1
8      5      1
9      6      1
10     7      1
11     0      0
12     0      0
Run Code Online (Sandbox Code Playgroud)

扩展 - 我如何获得以下输出,为每个组提供不同的 Y 值?

ID     X      Y
1      1      1
2      2      1
3      1      1
4      0      0
5      0      0
6      1      2
7      4      2
8      5      2
9      6      2
10     7      2
11     0      0
12     0      0
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

一种选择是base R. 用于rle查找'X'中大于0的相邻值,然后rep根据lengths

df1$Y <- with(rle(df1$X > 0), as.integer(rep(values & lengths > 2, lengths)))
df1$Y
#[1] 1 1 1 0 0 1 1 1 1 1 0 0
Run Code Online (Sandbox Code Playgroud)

对于OP帖子中更新的案例

df1$Y <- inverse.rle(within.list(rle(df1$X > 0), {
             i1 <- values & (lengths > 2)
      values[i1] <- seq_along(values[i1])}))
df1$Y
#[1] 1 1 1 0 0 2 2 2 2 2 0 0
Run Code Online (Sandbox Code Playgroud)

或者使用rleid来自data.table

library(data.table)
setDT(df1)[, Y := as.integer((.N > 2) * (X > 0)),rleid(X > 0)]
Run Code Online (Sandbox Code Playgroud)

数据

df1 <- structure(list(ID = 1:12, X = c(1L, 2L, 1L, 0L, 0L, 1L, 4L, 5L, 
 6L, 7L, 0L, 0L)), class = "data.frame", row.names = c(NA, -12L
 ))
Run Code Online (Sandbox Code Playgroud)