2017-01-02 16 views
1

Хотя есть много вопросов по удалению строк, я не смог найти решение для своей проблемы.Удаление строк на основе результата значения в соответствующей строке и другого значения столбца в предыдущей строке

Вот 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), ] 
} 

Где ошибка, и есть ли лучший способ, чем цикл? Спасибо!

ответ

2

Использование dplyr и может сделать

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

EDIT В случае, если вы хотите, чтобы держать линию, где laged D2 содержит полный набор условие использовать следующее:

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

После использования кода на нескольких данных .frames Я узнал, что код удаляет каждую первую строку сравнения, которая обычно должна оставаться. Используйте этот набор данных ниже, и вы поймете, что я имею в виду. Отфильтрованный фрейм данных должен начинаться с «1955-03-01». 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 »)), формат =«% Y-% m-% d ») , D2 = as.Date (as.character (c («1923-02-28», «1953-05-28», «1962-07-31», «1980-07-31», «1998-11 -30 "," 2015-12-31 ")), format ="% Y-% m-% d ")) – Simon1723

+0

Я не понимаю, с чего начать с 199-03-01? Разница до 1953-05-28 больше двух дней. – adibender

+0

@ Simon1723 Кроме того, первая запись в 'D1' всегда будет неактуальной, так как нет« предыдущей »записи' D2' – adibender

 Смежные вопросы

  • Нет связанных вопросов^_^