2016-10-31 1 views
-2

I ont deux trames de données: (period_example se compose de Beg et End) et price_example (composé de Date et High). Je veux la valeur la plus haute de High pour chaque période de Beg-End. Comment faire? Je vous remercie.extraction de valeur la plus élevée dans certaines périodes inégales/série chronologique

Voici les données:

period_example <- data.frame(Beg = as.Date(c("2000-01-01","2000-01-04","2000-01-09")), 
          End = as.Date(c("2000-01-03","2000-01-08","2000-01-12"))) 
price_example <- data.frame(Date = seq(as.Date("2000-01-01"), as.Date("2000-01-12"), by="days"), 
          High = c(100,105,104,103,102,106,107,108,109,110,115,114)) 

Le résultat devrait ressembler à ceci:

result <- data.frame(Beg = as.Date(c("2000-01-01","2000-01-04","2000-01-09")), 
        End = as.Date(c("2000-01-03","2000-01-08","2000-01-12")), 
        High = c(105,108,115)) 
+0

bienvenue à débordement de la pile :-) ce site n'est pas un générateur de code, s'il vous plaît montrer ce que vous avez essayé ([mcve]), et regardez [demander] – JimHawkins

+0

ups. Désolé JimHawkins, mon erreur n'a pas lu Comment demander avant. fera la prochaine fois. – iivan

Répondre

2

Je pense avoir trouvé une solution à ce problème, vous pouvez appliquer une fonction à chaque ligne et trouver au maximum entre ces dates dans l'autre trame de données:

period_example <- data.frame(Beg = as.Date(c("2000-01-01","2000-01-04","2000-01-09")),End = as.Date(c("2000-01-03","2000-01-08","2000-01-12"))) 
price_example <- data.frame(Date = seq(as.Date("2000-01-01"), as.Date("2000-01-12"),by="days"), High = c(100,105,104,103,102,106,107,108,109,110,115,114)) 

period_example$High <- apply(period_example,1 , function(x) max(price_example[price_example$Date >= x[1] & price_example$Date <= x[2], "High"])) 
> period_example 
     Beg  End High 
1 2000-01-01 2000-01-03 105 
2 2000-01-04 2000-01-08 108 
3 2000-01-09 2000-01-12 115 
0

Cela devrait fonctionner

period_example <- data.frame(Beg = as.Date(c("2000-01-01","2000-01-04","2000-01-09")),End = as.Date(c("2000-01-03","2000-01-08","2000-01-12"))) 

price_example <- data.frame(Date = seq(as.Date("2000-01-01"), as.Date("2000-01-12"),by="days"), High = c(100,105,104,103,102,106,107,108,109,110,115,114)) 


betweenDates <- function(target,beg,end){ 
    beg <- as.Date(beg) 
    end <- as.Date(end) 
    target <- as.Date(target) 
    return(target>=beg&target<=end) 
} 

selecteDates <- sapply(price_example$Date,function(x) betweenDates(x,period_example$Beg,period_example$End)) 


highValues <- sapply(1:nrow(period_example),function(x) max(price_example$High[selecteDates[x,]])) 


result <- data.frame(period_example,High=highValues) 
2

data.table a une fonction rapide pour cela: foverlaps.

library(data.table) 

x = setDT(period_example) 
y = setDT(price_example) 

y[, `:=` (Beg = Date, End = Date)] 

setkey(x, Beg, End) 
z = foverlaps(y, x) 

z[, .(High = max(High)), by = .(Beg, End)]