2017-10-09 28 views
1

大致日期的比賽,我有兩個R數據幀VLOOKUP中的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函數。 另外我不能像在link或使用日期分鐘差異由於我需要從因子數據幀,這是小於或等於從數據幀的日期的日期匹配因子索引如下面

apply(Dates, 1, function(x) min(which(abs(x - Factor$date) == min(abs(x - Factor$date))))) 

。 我的期望輸出應該是

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 

是否有任何有效的方式以外循環達到的效果

回答

2

如何data.table方法:

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

+0

那麼,這就是你沒有提供可以方便地複製的數據。試試'dt1 [dt2,on =「date」,roll = -Inf]'。 –

+0

通過'dt1 [dt2,on =「date」,roll = Inf]'得到了所需的解決方案。感謝您的迴應。 – amitbisai

1

也許你可以創建的所有密鑰的數據幀,加入值(「因素」),你必須他們,並使用一個迴路中的所有(而不是每行一個循環)

t1 <- data.frame(a=c(1, 3, 6), b=c(1, 1, 2)) 
t2 <- data.frame(a=c(1, 2, 4, 5, 7)) 
tsum <- data.frame(a=sort(unique(c(t1$a, t2$a)))) 
tmerge <- merge(tsum, t1, all.x=TRUE) 
for (i in c(1:nrow(tmerge))){if(is.na(tmerge$b[i])){tmerge$b[i]=tmerge$b[i-1]}} 
+0

感謝您的答覆,但如果我的日期數據幀的日期對應的行因素的結果可能無法正常工作1然後到第3行,即跳過一行或多行之間。 – amitbisai

+0

你可以在t2(或在你的情況下,日期數據框)過濾'''tmerge'''(僅)鍵。 –