Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vlookup R中的近似日期匹配_R_Date_Dataframe - Fatal编程技术网

vlookup R中的近似日期匹配

vlookup R中的近似日期匹配,r,date,dataframe,R,Date,Dataframe,我有两个R数据帧 Factor = data.frame(date = c("2015-10-01", "2016-01-01", "2016-04-01", "2016-07-01", "2016-10-01", "2017-01-01"), factor = c(0.07606455, 0.07170356, 0.07127930, 0.06807735, 0.06764824, 0.06709560)) Factor = date factor 2015-10-01 0.

我有两个R数据帧

Factor = data.frame(date = c("2015-10-01", "2016-01-01", "2016-04-01", 
"2016-07-01", "2016-10-01", "2017-01-01"), factor = c(0.07606455, 
0.07170356, 0.07127930, 0.06807735, 0.06764824, 0.06709560))

Factor =
date       factor
2015-10-01 0.07606455
2016-01-01 0.07170356
2016-04-01 0.07127930
2016-07-01 0.06807735
2016-10-01 0.06764824
2017-01-01 0.06709560

Dates = data.frame(date = c("2016-01-01", "2016-01-28", "2016-01-29", 
"2016-03-01", "2016-06-02", "2016-07-03", "2016-10-04", "2016-10-05"))

Dates = 
date       
2016-01-01 
2016-01-28 
2016-01-29 
2016-03-01 
2016-06-02 
2016-07-03 
2016-10-04
2016-10-05
我正在寻找一个Excel类型的Vlookup近似匹配。我无法执行R
merge
功能,因为日期不准确。 此外,我不能像中那样匹配索引,也不能像下面那样使用最小日期差异

apply(Dates, 1, function(x) min(which(abs(x - Factor$date) == min(abs(x - Factor$date))))) 
因为我需要factor from factor data frame,它小于或等于date from Dates dataframe。 我想要的输出应该是

Output = 
date       factor  
2016-01-01 0.07170356
2016-01-28 0.07170356
2016-01-29 0.07170356
2016-03-01 0.07170356
2016-06-02 0.07127930
2016-07-03 0.06807735
2016-10-04 0.06764824
2016-10-05 0.06764824

除了循环之外,还有什么有效的方法来实现结果吗?

也许您可以创建一个包含所有键的数据帧,在有键的地方连接值(“因子”),并对所有键使用一个循环(而不是每行一个循环)


t1关于
数据。表
方法:

library(data.table)
setDT(Dates)[, date := as.IDate(date)]
setDT(Factor)[, date := as.IDate(date)]
Factor[Dates, on = "date", roll = Inf]
#          date     factor
# 1: 2016-01-01 0.07170356
# 2: 2016-01-28 0.07170356
# 3: 2016-01-29 0.07170356
# 4: 2016-03-01 0.07170356
# 5: 2016-06-02 0.07127930
# 6: 2016-07-03 0.06807735
# 7: 2016-10-04 0.06764824
# 8: 2016-10-05 0.06764824

对于
Dates
中的每个日期,这将匹配
Factor
中较低/相等的最近日期,并获得其
Factor

,感谢您的响应,但如果在my Dates数据框中,日期对应于第1行的Factor,然后对应于第3行,则结果可能不起作用,例如,跳过中间的一行或多行。您可以过滤t2(或在您的情况下,日期数据框)中的(仅)键,因为您没有提供可以方便复制的数据。尝试
dt1[dt2,on=“date”,roll=-Inf]
。通过
dt1[dt2,on=“date”,roll=Inf]
获得所需的解决方案。谢谢你的回复。
library(data.table)
setDT(Dates)[, date := as.IDate(date)]
setDT(Factor)[, date := as.IDate(date)]
Factor[Dates, on = "date", roll = Inf]
#          date     factor
# 1: 2016-01-01 0.07170356
# 2: 2016-01-28 0.07170356
# 3: 2016-01-29 0.07170356
# 4: 2016-03-01 0.07170356
# 5: 2016-06-02 0.07127930
# 6: 2016-07-03 0.06807735
# 7: 2016-10-04 0.06764824
# 8: 2016-10-05 0.06764824