返回R中过去的最接近日期或等效日期
我有两个数据帧返回R中过去的最接近日期或等效日期,r,R,我有两个数据帧周一和t日期,如下所示: T Dates User.ID tdate 1 11-02-2013 1 04-03-2013 1 16-04-2015 1 03-05-2015 1 05-05-2015 1 11-05-2015 1 29-09-2015 1 26-11-2013 1 28-11-2013 3 01-02-2016 4 22-11-2
周一
和t日期
,如下所示:
T Dates
User.ID tdate
1 11-02-2013
1 04-03-2013
1 16-04-2015
1 03-05-2015
1 05-05-2015
1 11-05-2015
1 29-09-2015
1 26-11-2013
1 28-11-2013
3 01-02-2016
4 22-11-2012
4 25-04-2013
4 29-05-2013
Mondays
ID Monday Closest Date
1 05-09-2016
1 20-04-2015
1 27-07-2015
1 08-06-2015
1 13-10-2014
3 16-09-2013
3 16-02-2015
3 29-08-2016
3 26-05-2014
3 29-02-2016
3 18-07-2016
3 22-02-2016
4 16-11-2015
lasttxndate <- function(userid, mydate){
+ return(max(subset(tdates$Date.Asked, tdates$User.ID == userid & tdates$Date.Asked <= as.Date(mydate))))
+ }
现在,我想在tdates
的第3列中为mondays
中的每个User.ID
返回过去的最近日期或等效日期。
例如
预期产量为
Mondays
ID Monday Closest Date
1 05-09-2016 29-09-2015
1 20-04-2015 16-04-2015
1 27-07-2015 11-05-2015
1 08-06-2015 11-05-2015
1 13-10-2014 28-11-2013
3 16-09-2013 NA
3 16-02-2015 NA
3 29-08-2016 01-02-2016
3 26-05-2014 NA
3 29-02-2016 01-02-2016
3 18-07-2016 01-02-2016
3 22-02-2016 01-02-2016
4 16-11-2015 29-05-2013
对于ID=1的<代码>和<代码>2016年9月5日星期一<代码>
过去最近的tdate
是29-09-2015
,因此它将在最近日期
列中获取此日期
注意:如果未发现任何交易日期超过或等于周一的日期,则填写NAs
这必须针对一个非常大的数据集进行,任何关于如何实现这一点的想法。
我已使用自定义功能尝试了此操作,如下所示:
T Dates
User.ID tdate
1 11-02-2013
1 04-03-2013
1 16-04-2015
1 03-05-2015
1 05-05-2015
1 11-05-2015
1 29-09-2015
1 26-11-2013
1 28-11-2013
3 01-02-2016
4 22-11-2012
4 25-04-2013
4 29-05-2013
Mondays
ID Monday Closest Date
1 05-09-2016
1 20-04-2015
1 27-07-2015
1 08-06-2015
1 13-10-2014
3 16-09-2013
3 16-02-2015
3 29-08-2016
3 26-05-2014
3 29-02-2016
3 18-07-2016
3 22-02-2016
4 16-11-2015
lasttxndate <- function(userid, mydate){
+ return(max(subset(tdates$Date.Asked, tdates$User.ID == userid & tdates$Date.Asked <= as.Date(mydate))))
+ }
lasttxndate#日期转换
周一$周一此代码运行良好:
T.Dates <- data.frame(
User.ID=c("1","1","1","1","1","1","1","1","1","3","4","4","4"),
tdate=as.Date(c("11-02-2013","04-03-2013","16-04-2015","03-05-2015","05-05-2015","11-05-2015","29-09-2015","26-11-2013","28-11-2013","01-02-2016","22-11-2012","25-04-2013","29-05-2013"),format="%d-%m-%Y"))
Mondays <- data.frame(
ID=c("1","1","1","1","1","3","3","3","3","3","3","3","4"),
Monday=as.Date(c("05-09-2016","20-04-2015","27-07-2015","08-06-2015","13-10-2014","16-09-2013","16-02-2015","29-08-2016","26-05-2014","29-02-2016","18-07-2016","22-02-2016","16-11-2015"),format="%d-%m-%Y"))
Mondays$Closest.Date <- NA
Mondays$Closest.Date <- as.Date(Mondays$Closest.Date, format="%d-%m-%Y")
for(i in 1:nrow(Mondays)){
Mondays[i,"Closest.Date"] <- max(T.Dates$tdate[T.Dates$User.ID==Mondays$ID[i] & T.Dates$tdate <= Mondays[i,"Monday"]])
}
T.Dates即使是一个小样本的数据对我们来说也很好!:)而且dput(周一),…
也很有帮助。正如joel.wilson所说:请仅包括理解和再现问题所需的数据。数据缩短,请参阅编辑的问题。请根据您的需求添加预期输出examples@Sotos:已添加输出,请参见。此操作正常,请您解释一下日期[星期一,on=c(“ID”,“星期一”),roll=Inf]
@pankaj关于data.table join,有很多很好的答案。对于滚动连接,请阅读。也请参见此处