data.table根据组的滞后值删除行 [英] data.table remove rows based on lag value by group

查看:77
本文介绍了data.table根据组的滞后值删除行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 data.table ,格式如下:

DT <- data.table(tag = rep(c("A", "B"), each = 10),
                 value =  c(0, 3, 3, 3, 0, 1, 1, 1, 3, 0,
                            0, 1, 3, 1, 0, 3, 0, 1, 1, 0))
> DT
    tag value
 1:   A     0
 2:   A     3
 3:   A     3
 4:   A     3
 5:   A     0
 6:   A     1
 7:   A     1
 8:   A     1
 9:   A     3
10:   A     0
11:   B     0
12:   B     1
13:   B     3
14:   B     1
15:   B     0
16:   B     3
17:   B     0
18:   B     1
19:   B     1
20:   B     0

我想删除所有值为3的行,但只有那些跟随0的行。也就是说,我要删除第2、3、4和16行,但需要保留第9行和第13行。

I would like to remove all the rows that have value of 3 but only those follow a 0. That is I would like to remove row 2, 3, 4 and row 16, but need to keep row 9 and row 13.

是否可以执行此操作?

推荐答案

可能的解决方案:

DT[, `:=` (threes = rleid(value==3), apz = value == 3 & shift(value) == 0)
   ][, if (all(!apz)) .SD, by = threes
     ][, c('threes','apz') := NULL]

它给出:

    tag value
 1:   A     0
 2:   A     0
 3:   A     1
 4:   A     1
 5:   A     1
 6:   A     3
 7:   A     0
 8:   B     0
 9:   B     1
10:   B     3
11:   B     1
12:   B     0
13:   B     0
14:   B     1
15:   B     1
16:   B     0

这篇关于data.table根据组的滞后值删除行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆