Ближайшая дата в векторе к заданной дате

Я хотел бы определить ближайшую дату в векторе заданной даты. Допустим, у меня есть следующий вектор дат (с 5 случайными датами):

coldate= as.Date(c("2013-08-03", "2013-09-04", "2013-09-08", "2013-09-12", "2013-11-01"));

Теперь я хочу найти ближайшую дату к x = as.Date("2013-10-01") внутри этого вектора.

Вот мой код:

> which((coldate-x) == min(coldate-x))
  [1] 1

Результат должен быть 4, так как дата "2013-09-12" является ближайшей. Но у меня есть 1... Что не так в моем коде?


person Henri    schedule 28.02.2013    source источник
comment
проверить neardate в пакете выживания   -  person Tony Ladson    schedule 16.06.2017
comment
Вы также можете использовать base::findInterval(x, coldate)   -  person psychonomics    schedule 29.01.2019


Ответы (3)


вы пропустите abs, чтобы позаботиться об отрицательных значениях:

which(abs(coldate-x) == min(abs(coldate - x)))
[1] 4
person Arun    schedule 28.02.2013
comment
в моем реальном векторе холода у меня есть NA. Теперь команда возвращает целое число (0). Как мне быть с этим АН? - person Henri; 28.02.2013
comment
@Henri - удалите NA из функции min: which(abs(coldate-x) == min(abs(coldate-x),na.rm=TRUE)) - person thelatemail; 28.02.2013
comment
@thelatemail Это работает. благодарю вас. - person Henri; 28.02.2013
comment
как бы это работало, если бы x был столбцом дат, а не одним значением? - person Garglesoap; 22.05.2020

См. также функцию which.min:

R> which.min(abs(x-coldate))
[1] 4
person rcs    schedule 28.02.2013
comment
Хотя which.min кажется очевидным выбором, преимущество ответа @Arun заключается в том, что он вернет несколько значений, если есть несколько минимальных значений. То, как вы справляетесь с этими случаями, на самом деле может быть проблемой при создании чистого набора данных, но это то, что следует учитывать. - person thelatemail; 01.03.2013
comment
Спасибо за ваш комментарий @thelatemail. Теперь я сортирую coldate перед использованием which.min, чтобы получить «более низкое» совпадение. - person Stefan Jelkovich; 29.12.2020

Функция which.closest() из пакета birk — это простой вариант.

coldate= as.Date(c("2013-08-03", "2013-09-04", "2013-09-08", "2013-09-12", "2013-11-01"))
x = as.Date("2013-10-01")

which.closest(coldate, x)
[1] 4
person CephBirk    schedule 26.02.2016