2013-09-05 2 views
2

У меня есть dataframe, который содержит даты идентификаторов и запуска, и для каждого из них я хочу знать, какой диапазон дат (Time_Seq) каждая дата запуска вКак найти, какой диапазон дат находится?

Вектор дат выглядит следующим образом:.

data: 
    ID  LAUNCH_DATE 
1 50314486 2004-01-01 
2 55842774 2004-01-27 

и у меня есть dataframe временной последовательности, которая содержит различные диапазоны данных:

head(Time_Table): 
    Time_Seq DateFrom  DateTo 
1  726 2003-12-29 2004-01-04 
2  727 2004-01-05 2004-01-11 
3  728 2004-01-12 2004-01-18 
4  729 2004-01-19 2004-01-25 
5  730 2004-01-26 2004-02-01 
6  731 2004-02-02 2004-02-08 

в идеале я хотел бы выход выглядеть следующим образом:

ID  LAUNCH_DATE Time_Seq 
1 50314486 2004-01-01  726 
2 55842774 2004-01-27  731 

В настоящее время я могу работать его на один день в очень обыкновенное письмо, что, выполнив:

Time_Table$Time_Seq[which((date$LAUNCH_DATE[1]>=Time_Table$DATEFROM)&(date$LAUNCH_DATE[1]<=Time_Table$DATETO))] 

Может кто-нибудь предложить более простой способ без петли таким образом?

ответ

1

Функция cut Функция сокращения непрерывных переменных в категории работает для дат.

data$Time_Seq <- cut(
    data$LAUNCH_DATE, 
    c(Time_Table$DateFrom, Time_Table$DateTo[nrow(Time_Table)]), 
    labels = Time_Table$Time_Seq, 
    right = FALSE 
) 
+0

Это работало очень хорошо, спасибо @RichieCotton. Единственное дополнение, которое я добавил бы, это то, что мне нужно добавить дополнительную дату в Time_Table $ DateFrom, которая необходима для закрытия окончательного Time_Seq. – gabrown86

+0

@ gabrown86 Хорошая точка. Исправлена. –

2

Я просто хотел играть с interval и %within% в пакете lubridate:

library(lubridate) 

# create intervals 
interval <- with(Time_Table, new_interval(ymd(DateFrom), ymd(DateTo))) 

# for each LAUNCH_DATE, test whether it falls within an interval, and pick corresponding Time_Seq 
data$Time_Seq <- sapply(data$LAUNCH_DATE, function(x) Time_Table$Time_Seq[ymd(x) %within% interval]) 
+0

Превосходное использование уже существующего пакета 'lubridate'. – CephBirk

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