r - 在连续行中查找值

标签 r for-loop if-statement

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

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

我想对其应用逻辑,以查看是否有 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

扩展 - 我如何获得以下输出,为每个组提供不同的 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

最佳答案

base R 的一个选项。使用 rle 找到 'X' 中大于 0 的相邻值,然后根据 lengths

进行 replication >
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

对于 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

或者使用 data.table 中的 rleid

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

数据

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
 ))

关于r - 在连续行中查找值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54182880/

相关文章:

R:使用多列中的条件删除行并替换值

R:ifelse 函数返回向量位置而不是值(字符串)

c - 素数输出错误

python - 从Python中的字典中获取键值

r - 在 R 的 for 循环中使用粘贴函数编写 ifelse 语句

c - 运算符 == 在 C 中不起作用

r corrplot 与聚类 : default dissimilarity measure for correlation matrix

r - 匹配多个模式

r - 使用 atop() 时完全左对齐

javascript - 循环对象和循环数组的嵌套 for 循环