vlookup R中的近似日期匹配
我有两个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.
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近似匹配。我无法执行Rmerge
功能,因为日期不准确。
此外,我不能像中那样匹配索引,也不能像下面那样使用最小日期差异
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