2013-02-28 5 views
13

Я хотел бы определить ближайшую дату в векторе заданной даты. Скажем, у меня есть следующие даты вектор (с 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 ... Что случилось в моем коде?

+0

проверить 'близость' в пакете выживания –

ответ

14

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

which(abs(coldate-x) == min(abs(coldate - x))) 
[1] 4 
+0

в моем фактическом векторе холода, у меня есть NA. Теперь команда возвращает целое число (0). Как мне с этим бороться? – Henri

+2

@Henri - удалить NA из функции 'min':' which (abs (coldate-x) == min (abs (coldate-x), na.rm = TRUE)) ' – thelatemail

+0

@thelatemail Это работает. Спасибо. – Henri

5

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

R> which.min(abs(x-coldate)) 
[1] 4 
+0

Хотя 'which.min' кажется очевидным выбором, преимущество ответа от @Arun заключается в том, что оно вернет несколько значений, если существует несколько минимальных значений. Как вы справляетесь с этими случаями, на самом деле может быть проблемой при создании чистого набора данных, но это то, что нужно учитывать. – thelatemail

3

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