2017-02-12 3 views
0

У меня есть два набора данных. Тот, который собирается примерно каждые 5 дней, а другой собирается каждые 15 минут ежедневно. Мне нужен окончательный список, который соответствует ближайшей дате от менее частых наборов данных к записи в более частом.Найти ближайшую дату между dataset1 и dataset2

Например:

satDat <- c('2015-04-16', '2015-04-21', '2012-04-26') # collected every 5 days 

stationDat <- sort(rep(seq(as.Date("2015-04-01"), as.Date("2015-04-20"), by='day'),2)) 
#collected multiple times a day 

[1] "2015-04-01" "2015-04-01" "2015-04-02" "2015-04-02" "2015-04-03" 
[6] "2015-04-03" "2015-04-04" "2015-04-04" "2015-04-05" "2015-04-05" 
[11] "2015-04-06" "2015-04-06" "2015-04-07" "2015-04-07" "2015-04-08" 
[16] "2015-04-08" "2015-04-09" "2015-04-09" "2015-04-10" "2015-04-10" 
[21] "2015-04-11" "2015-04-11" "2015-04-12" "2015-04-12" "2015-04-13" 
[26] "2015-04-13" "2015-04-14" "2015-04-14" "2015-04-15" "2015-04-15" 
[31] "2015-04-16" "2015-04-16" "2015-04-17" "2015-04-17" "2015-04-18" 
[36] "2015-04-18" "2015-04-19" "2015-04-19" "2015-04-20" "2015-04-20" 

Я хочу, чтобы мои результаты, чтобы посмотреть, как этот

[1] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
[6] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
[11] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
[16] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
[21] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
[26] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
[31] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
[36] "2015-04-16" "2015-04-21" "2015-04-21" "2015-04-21" "2015-04-21" 
+0

Помогает ли ответ в этом вопросе (http://stackoverflow.com/questions/31103897/matching-timestamped-data-to-closest-time-in-another-dataset-properly-vectorize)? –

+0

'satDat [apply (abs (внешний (satDat, stationDat, difftime, units = 'days')), 2, which.min)]', хотя я подозреваю, что есть более элегантный вариант – alistaire

+0

Поскольку один из векторов отсортирован, вы можете воспользоваться 'cut', чтобы сузить возможные даты, чтобы проверить, что решение @ alistaire не так взрывоопасно. (Это будет больше кода, конечно, но очень полезно, если ваши данные достаточно большие.) – r2evans

ответ

0

Возможности использование outer:

satDat[apply(abs(outer(satDat, stationDat, difftime, units = 'days')), 2, which.min)] 

#> [1] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
#> [6] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
#> [11] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
#> [16] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
#> [21] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
#> [26] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
#> [31] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
#> [36] "2015-04-16" "2015-04-21" "2015-04-21" "2015-04-21" "2015-04-21" 

Как это работает:

  • outer принимает относится difftime к каждому паре элементам в двух векторах, возвращая матрицу,
  • над который apply выполняет итерации по столбцам (MARGIN = 2), вызывая which.min на каждый, который возвращает индекс наименьшего,
  • , который используется для подмножества satDat.

Обратите внимание, что outer выделяет матрицу с размерами length(satDat) по length(stationDat), что может потребовать много памяти, если ваши данные уже большие.

0

прокатный присоединиться предлагаемыми пакетами data.table приходит на ум.

library(data.table) 
DT1 <- data.table(date = as.Date(satDat), date1 = as.Date(satDat)) 
DT2 <- data.table(date = stationDat) 

DT1[DT2, date1, roll = "nearest", on = .(date)] 
# [1] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
# [7] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
#[13] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
#[19] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
#[25] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
#[31] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
#[37] "2015-04-21" "2015-04-21" "2015-04-21" "2015-04-21" 

Возможно, это также полезно для любой вашей фактической задачи, потому что я подозреваю, что это выходит за рамки этого.

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