2016-10-31 2 views
-2

Ich habe zwei Datenrahmen: period_example (besteht aus Beg und End) und price_example (besteht aus Date und High). Ich möchte den höchsten Wert von Hoch für jede Beg-Ende-Periode haben. Wie es geht? Vielen Dank. HierExtrahierung höchster Wert in einem gewissen ungleichen Perioden/zeitseriellen

die Daten:

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)) 

Das Ergebnis so sein sollte:

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

willkommen Überlauf zu stapeln :-) diese Seite nicht ein Code-Generator ist, zeigen Sie, was Sie versucht haben ([MCVE]), und schauen Sie sich [fragen] – JimHawkins

+0

ups. Sorry JimHawkins, mein Fehler hat nicht gelesen, wie man vorher fragt. wird das nächste Mal machen. – iivan

Antwort

2

Ich denke, dass ich eine Lösung für dieses Problem gefunden, eine Funktion auf jede Zeile anwenden könnte und finden der max zwischen diesen Daten in dem anderen Datenrahmen:

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

Dies sollte

0 arbeiten
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 hat eine schnelle Funktion dafür: 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)] 
Verwandte Themen