2014-02-06 4 views
3

У меня есть два кадра данных:Поиск ближайшей даты в кадре данных

purchases: 

       time  quantity 
    1: 2013-07-31 03:42:02 30  
    2: 2013-07-31 03:59:32 30   
    3: 2013-07-31 04:02:22 28  
    .... 

history: 

       time  price 
    1: 2013-07-31 04:26:46 10 
    2: 2013-07-31 07:11:01 10 
    3: 2013-07-31 08:16:36  5 
    4: 2013-07-31 08:40:03  8 
    5: 2013-07-31 08:47:56  7 
    .... 

Что я хочу сделать: для каждой строки в «покупке», посмотрите в «историях» строке с ближайшей датой (если возможно меньше, что один в «покупке»)

Я пытался сделать что-то вроде этого

history <- as.vector(history$time) 

для каждой строки в закупках:

current.price <- purchases[i,]$time 
which(history-current.price)==min(history-current.price) 

Это полезно, если значения являются числовыми, но я не знаю, как обрабатывать тезисы даты класса POSIXct.

EDIT: добавлена ​​воспроизводимые данные

#Reproducible dummy data 
p <- read.table(text=" 
t,quantity 
2013-07-31 03:42:02,30 
2013-07-31 03:59:32,30 
2013-07-31 04:02:22,28",header=TRUE,sep=",") 
h <- read.table(text=" 
t,price 
2013-07-31 04:26:46,10 
2013-07-31 07:11:01,10 
2013-07-31 08:16:36,5 
2013-07-31 08:40:03,8 
2013-07-31 08:47:56,7",header=TRUE,sep=",") 
#Convert to POSIXct 
p$t <- as.POSIXct(strptime(p$t, "%Y-%m-%d %H:%M:%S")) 
h$t <- as.POSIXct(strptime(h$t, "%Y-%m-%d %H:%M:%S")) 
+0

Попробуйте [difftime] (http://stat.ethz.ch/R-manual/R-devel/library/base/html/difftime.html)? – zx8754

+1

Сделайте скользящее соединение с data.tables? – Roland

+1

Добавлены воспроизводимые данные на случай, если кто-то захочет пойти ... – zx8754

ответ

3

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

#Reproducible dummy data 
p <- read.table(text=" 
t,quantity 
2013-07-31 03:42:02,30 
2013-07-31 03:59:32,30 
2013-07-31 04:02:22,28 
2013-07-31 04:40:22,28 
2013-07-31 05:50:22,28 
2013-07-31 08:40:22,28",header=TRUE,sep=",") 
h <- read.table(text=" 
t,price 
2013-07-31 04:10:46,10 
2013-07-31 04:35:46,10 
2013-07-31 07:11:01,10 
2013-07-31 08:16:36,5 
2013-07-31 08:40:03,8 
2013-07-31 08:47:56,7",header=TRUE,sep=",") 
#Convert to POSIXct 
p$t <- as.POSIXct(strptime(p$t, "%Y-%m-%d %H:%M:%S")) 
h$t <- as.POSIXct(strptime(h$t, "%Y-%m-%d %H:%M:%S")) 


get_closest_line_in_history <- function(x, history){ 
    time_diffs <- difftime(x, history) 
    time_diffs[time_diffs<0] <- NA 

    res <- which.min(time_diffs) 
    if (length(res) != 1){ 
    return(NA) 
    }else{ 
    return(res) 
    } 
} 

sapply(p$t, get_closest_line_in_history, h$t) 
Смежные вопросы