如何基于上一行过滤行并使用dplyr保留上一行?

时间:2019-01-24 14:29:13

标签: r filter dplyr conditional-statements subset

我试图使用基于上一行的条件对数据集的行进行子集化,同时将上一行保留在子集数据中。这与这里的问题基本相同,但是我正在寻找一种dplyr方法:

Select specific rows based on previous row value (in the same column)

我已经在注释中采用了dplyr方法来回答该问题,但是我无法弄清楚保留上一行的最后一步。

我可以获得支持我感兴趣的条件的行(当上一行不是incorrect时为enter)。

set.seed(123)
x=c("enter","incorrect","enter","correct","incorrect",
"enter","correct","enter","incorrect")
y=c(runif(9, 5.0, 7.5))
z=data.frame(x,y)

filter(z, x=="incorrect" & lag(x)!="enter")

如预期那样给予:

      x        y
1 incorrect 7.351168 

我想产生的结果是这样,以便将根据条件过滤的所有行与原始数据集中在它们之前的行一起存储:

        x        y
1   correct 7.207544
2 incorrect 7.351168

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

通过过滤,您可以执行以下操作:

z %>%
  filter( (x == "incorrect" & lag(x) != "enter") | lead(x == "incorrect" & lag(x) != "enter") )

给予:

          x        y
1   correct 7.207544
2 incorrect 7.351168