Я бы хотел найти на 5 больше, чем предыдущий номер, и удалить их.
Например, начиная со списка ниже:
list <- c(1,1,15,1,4,2,3,1,20,1,3,2)
В результате приведен список ниже:
list <- c(1,1,1,4,2,3,1,1,3,2)
Это исключило 15 и 20 из исходного списка.
с использованием базы
x <- c(1,1,15,1,4,2,3,1,20,1,3,2) x[which(diff(c(0,x)) < 5 | diff(c(0, x)) < 0)] #[1] 1 1 1 4 2 3 1 1 3 2
Мы можем использовать diff:
diff
list[c(TRUE, diff(list) <= 5)] #[1] 1 1 1 4 2 3 1 1 3 2
Другие варианты могут быть:
list[c(TRUE, tail(list, -1) - head(list, -1) <= 5)] list[list - dplyr::lag(list, default = list[1]) <= 5] list[list - data.table::shift(list, fill = list[1]) <= 5]
Вместо удаления, если мы хотим заменить их на среднее значение соответствующих значений мы можем повернуть значения до NA и затем использовать na.approx.
NA
na.approx
list[c(FALSE, diff(list) >= 5)] <- NA zoo::na.approx(list) #[1] 1 1 1 1 4 2 3 1 1 1 3 2