2017-10-09 1 views
1

J'ai deux trames de données Rvlookup matchs de date approximative en 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 

Je cherche un type Excel pour Vlookup correspondance approximative. Je ne peux pas faire R merge fonction que les dates ne sont pas exactes. Je ne peux pas correspondre à l'index comme dans les link ou en utilisant les différences de date min comme ci-dessous

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

Depuis que je requiers le facteur de trame de données du facteur qui est inférieur ou égal à ce jour à partir des dates dataframe. Ma sortie désirée devrait être

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 

est-il un moyen efficace autre que boucle pour obtenir le résultat

Répondre

2

Que diriez-vous data.table approche:

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 

Pour chaque date Dates, qui correspondra le plus bas/égale date la plus proche à Factor et obtenir ses factor

+0

Eh bien, c'est ce que vous obtenez pour ne pas fournir de données qui peuvent être facilement copiées. Essayez 'dt1 [dt2, on =" date ", roll = -Inf]'. –

+0

Vous obtenez la solution désirée par 'dt1 [dt2, on =" date ", roll = Inf]'. Merci pour la réponse. – amitbisai

1

Peut-être que vous pouvez créer une trame de données avec toutes les touches, joignez-vous des valeurs (« facteurs ») où vous avez eux, et utiliser une boucle pour tous (au lieu d'une boucle par ligne)

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

Merci pour la réponse, mais le résultat pourrait ne pas fonctionner si mes dates dataframe la date correspond à prendre en ligne 1 puis à la ligne 3, c'est-à-dire en sautant une ou plusieurs lignes entre les deux. – amitbisai

+0

vous pouvez filtrer '' '' tmerge''' pour (seulement) les clés en t2 (ou dans votre cas, les dates dataframe) –