根据相关行中的值和前一行中其他列值的结果删除行

Delete rows based on result of value in concerned row and of other column value in previous row

虽然有很多关于删除行的问题,但我找不到解决问题的方法。

这里以data.frame为例:

df <- data.frame(A = c(1,2,3,4,5,6), 
             D1 = as.Date(as.character(c("1863-12-01","1945-06-06","1955-03-01","1962-08-01","1980-08-01","1998-12-01")), format = "%Y-%m-%d"),
             D2 = as.Date(as.character(c("1923-02-28","1953-05-28","1962-07-31","1978-06-30","1998-11-30","2015-12-31")), format = "%Y-%m-%d"))

结果应该没有 D1 行的日期和 D2 的上一行日期之间超过一天的行,请参见:

A    D1         D2
5 1980-08-01 1998-11-30
6 1998-12-01 2015-12-31

我通过循环尝试了它,但它没有按要求的方式工作 - 我必须一次又一次地重复循环以获得最终结果:

for (i in 1:length(df))
{
  if ((df$D1[i + 1] - df$D2[i]) > 1)
    df <- df[-c(i), ]
}

bug在哪里,有没有比循环更好的方法?谢谢!

使用 dplyr 你可以做到

library(dplyr)
filter(df, D1 - lag(D2) < 2)

编辑 如果您想保留延迟 D2 满足条件的行,请使用以下内容:

filter(df, lead(D1) - D2 < 2 | D1 - lag(D2) < 2)