2016-09-02 4 views
0

У меня есть 2 набора данных, каждый из которых содержит значение даты и времени в формате POSIXlt и некоторые другие числовые и символьные переменные.R - Как присоединиться к двум кадрам данных к ближайшей дате?

Я хочу объединить оба набора данных на основе столбца даты и времени. Но штампы даты обоих наборов данных не совпадают, поэтому мне нужно объединить их по ближайшей дате (до или после). В моем примере значение данных «e» от 2016-03-01 23:52:00 должно быть объединено с «binH» в 2016-03-02 00:00:00, а не «binG».

Есть ли функция, которая позволила бы мне совместить мои наборы данных с ближайшим значением даты и времени, даже если это после?

Я нашел способы объединения дат со следующей предыдущей датой с помощью функции cut() или функции roll = Inf в data.tables. Но я не мог получить свои временные метки в любом формате roll = 'ближайшее'.

>df1 
    date1 value 
    1 2016-03-01 17:52:00  a 
    2 2016-03-01 18:01:30  b 
    3 2016-03-01 18:05:00  c 
    4 2016-03-01 20:42:30  d 
    5 2016-03-01 23:52:00  e 

    >df2 
    date2 bin_name 
    1 2016-03-01 17:00:00  binA 
    2 2016-03-01 18:00:00  binB 
    3 2016-03-01 19:00:00  binC 
    4 2016-03-01 20:00:00  binD 
    5 2016-03-01 21:00:00  binE 
    6 2016-03-01 22:00:00  binF 
    7 2016-03-01 23:00:00  binG 
    8 2016-03-02 00:00:00  binH 
    9 2016-03-02 01:00:00  binI 
+0

Надеюсь, вы действительно имели в виду формат POSIXct. Хранение векторов POSIXlt (которые действительно являются списками) в dataframes является рецептом для массового путаницы. –

ответ

2

data.table должны работать для этого (вы можете объяснить ошибки вы наталкивается?), Хотя это, как правило, конвертировать POSIXlt в POSIXct сама по себе (возможно, сделать это преобразование на столбце даты и времени вручную держите data.table счастливым). Также убедитесь, что вы устанавливаете столбец ключей перед использованием roll.

(я создал свой собственный пример таблицы здесь, чтобы сделать свою жизнь немного легче Если вы хотите использовать dput по вашему, я счастлив обновить этот пример с вашими данными.):

new <- data.table(date = as.POSIXct(c("2016-03-02 12:20:00", "2016-03-07 12:20:00", "2016-04-02 12:20:00")), data.new = c("t","u","v")) 
head(new, 2) 

        date data.new 
1: 2016-03-02 12:20:00  t 
2: 2016-03-07 12:20:00  u 

old <- data.table(date = as.POSIXct(c("2016-03-02 12:20:00", "2016-03-07 12:20:00", "2016-04-02 12:20:00", "2015-03-02 12:20:00")), data.old = c("a","b","c","d")) 
head(old, 2) 


        date data.old 
1: 2016-03-02 12:20:00  a 
2: 2016-03-07 12:20:00  b 

setkey(new, date) 
setkey(old, date) 

combined <- new[ old, roll = "nearest" ] 
combined 

        date data.new data.old 
1: 2015-03-02 12:20:00  t  d 
2: 2016-03-02 12:20:00  t  a 
3: 2016-03-07 12:20:00  u  b 
4: 2016-04-02 12:20:00  v  c 

Я намеренно сделал две таблицы разными длин строк, чтобы показать, как скользящее соединение имеет дело с несколькими совпадениями. Вы можете переключить способ соединения:

combined <- old[ new, roll = "nearest" ] 
combined 

        date data.old data.new 
1: 2016-03-02 12:20:00  a  t 
2: 2016-03-07 12:20:00  b  u 
3: 2016-04-02 12:20:00  c  v 
+1

@ user2223405 это решение работает для вас? В любом случае, убедитесь, что вы не просто оставите свой вопрос. Вернитесь и сообщите нам, что сработало, а что нет. – rosscova

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