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

时间:2017-01-02 21:05:49

标签: r filter conditional subset

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

这是一个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), ]
}

错误在哪里,是否有比循环更好的方法?谢谢!

1 个答案:

答案 0 :(得分:2)

使用dplyr你可以做

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

修改 如果您想保持D2满填充条件的行使用以下内容:

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