объединить данные на основе диапазона даты / времени в R - PullRequest
9 голосов
/ 25 марта 2011

У меня есть один файл (местоположение), который имеет координаты x, y и дату / время. Я хочу получить информацию из второй таблицы (погода), в которой есть «похожая» переменная даты / времени и дополнительные переменные (температура и скорость ветра). Хитрость в том, что дата / время не совпадают одинаково в обеих таблицах. Я хочу выбрать данные о погоде, которые ближайшие из данных о местоположении. Я знаю, что мне нужно сделать несколько циклов, вот и все.

Example location                                    example weather

x    y     date/time                         date/time           temp        wind
1    3     01/02/2003 18:00                  01/01/2003 13:00     12          15
2    3     01/02/2003 19:00                  01/02/2003 16:34     10          16
3    4     01/03/2003 23:00                  01/02/2003 20:55     14          22
2    5     01/04/2003 02:00                  01/02/2003 21:33     14          22
                                             01/03/2003 00:22     13          19
                                             01/03/2003 14:55     12          12
                                             01/03/2003 18:00     10          12
                                             01/03/2003 23:44     2           33
                                             01/04/2003 01:55     6           22

Таким образом, конечным результатом будет таблица с правильно «наилучшим» сопоставленным погодным данным с данными о местоположении

x    y     datetime               datetime           temp        wind
1    3     01/02/2003 18:00  ----  01/02/2003 16:34     10          16
2    3     01/02/2003 19:00  ----  01/02/2003 20:55     14          22
3    4     01/03/2003 23:00  ----  01/03/2003 00:22     13          19               
2    5     01/04/2003 02:00  ----  01/04/2003 01:55     6           22

Есть предложения, с чего начать? Я пытаюсь сделать это в R

Ответы [ 2 ]

5 голосов
/ 25 марта 2011

Мне нужно было объединить эти данные в виде данных и времени отдельно, а затем вставить и отформатировать

location$dt.time <- as.POSIXct(paste(location$date, location$time), 
                                 format="%m/%d/%Y %H:%M")

И то же самое для weather

Затем для каждого значения date.timeв location найдите запись в weather, которая имеет самые низкие абсолютные значения для разницы во времени:

 sapply(location$dt.time, function(x) which.min(abs(difftime(x, weather$dt.time))))
# [1] 2 3 8 9
 cbind(location, weather[ sapply(location$dt.time, 
                      function(x) which.min(abs(difftime(x, weather$dt.time)))), ])

  x y       date  time             dt.time       date  time temp wind             dt.time
2 1 3 01/02/2003 18:00 2003-01-02 18:00:00 01/02/2003 16:34   10   16 2003-01-02 16:34:00
3 2 3 01/02/2003 19:00 2003-01-02 19:00:00 01/02/2003 20:55   14   22 2003-01-02 20:55:00
8 3 4 01/03/2003 23:00 2003-01-03 23:00:00 01/03/2003 23:44    2   33 2003-01-03 23:44:00
9 2 5 01/04/2003 02:00 2003-01-04 02:00:00 01/04/2003 01:55    6   22 2003-01-04 01:55:00

 cbind(location, weather[ 
                  sapply(location$dt.time, 
                    function(x) which.min(abs(difftime(x, weather$dt.time)))), ])[ #pick columns
                          c(1,2,5,8,9,10)]

  x y             dt.time temp wind           dt.time.1
2 1 3 2003-01-02 18:00:00   10   16 2003-01-02 16:34:00
3 2 3 2003-01-02 19:00:00   14   22 2003-01-02 20:55:00
8 3 4 2003-01-03 23:00:00    2   33 2003-01-03 23:44:00
9 2 5 2003-01-04 02:00:00    6   22 2003-01-04 01:55:00

Мои ответы кажутся немного другими, чем ваши, но другой читатель уже поставил под сомнение ваши способности делатьправильное соответствие вручную.

5 голосов
/ 25 марта 2011

Одним быстрым и коротким путем может быть использование data.table .Если вы создаете два data.table X и Y, оба с ключами, то синтаксис:

X[Y,roll=TRUE]

Мы называем это скользящее соединение , потому что мы бросаем преобладающее наблюдение в X впередчтобы соответствовать строке в Y. Смотрите примеры в? data.table и вводной виньетке.

Еще один способ сделать это - пакет zoo, в котором есть locf (последнее наблюдение перенесено), и, возможно, другие пакеты тоже,

Я не уверен, имеете ли вы в виду самое близкое с точки зрения местоположения или времени.Если местоположение и это координаты x, y, то вам понадобится измерение расстояния в 2D-пространстве.data.table только одномерно «ближайший», например, по времени.Читая ваш вопрос во второй раз, кажется, что вы имеете в виду самое близкое в преобладающем смысле.

РЕДАКТИРОВАТЬ: Посмотрите пример данных сейчас.data.table не сделает этого за один шаг, потому что, хотя он может катиться вперед или назад, он не катится до ближайшего.Вы можете сделать это с помощью дополнительного шага, используя которого = ИСТИНА, и затем проверить, был ли один после преобладающего на самом деле ближе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...