2016-12-03 2 views
0

bekam ich zwei Datenrahmen, die wie folgt aussieht:Nutzungsdaten als Indikatoren auf eine Funktion von zwei verschiedenen Datenrahmen

dataframe1

individual OpenDate CloseDate MeanReturn 
1   1 2010-01-04 2010-01-08  NaN 
2   2 2010-01-01 2010-01-08  NaN 
3   3 2010-01-03 2010-01-06  NaN 
4   4 2010-01-02 2010-01-05  NaN 
5   5 2010-01-04 2010-01-06  NaN 

Und dataframe2

 Date Return 
1 2010-01-01 532 
2 2010-01-02 645 
3 2010-01-03 213 
4 2010-01-04 567 
5 2010-01-05 986 
6 2010-01-06 123 
7 2010-01-07 567 
8 2010-01-08 654 

Was muss ich do ist es irgendwie den MeanReturn für jedes Individuum zu berechnen, zB für Individuum 5: MeanReturn = (567 + 986 + 123)/3

Meine echten Daten bestehen aus über 10.000 Individuen mit einem Zeitraum von über 2 Jahren, also ist es leider nicht so einfach von Hand zu machen.

Ich bin seit fast zwei Wochen an diesem Problem fest und es macht mich wahnsinnig - irgendwelche Vorschläge, wie man es löst?

+0

Willkommen bei SO! Wenn Sie Daten im 'r'-Tag teilen möchten, fügen Sie bitte eine' dput() 'davon hinzu. Bewegen Sie den Mauszeiger über das 'r'-Tag, um weitere Informationen zu erhalten. –

+0

also für jede Zeile, die Sie wollen, die eine vor und nach? – statquant

Antwort

0

Da der zweite Datenrahmen durch Date seine Rückkehr sortiert, können wir match verwenden Sie den Bereich von Return bis durchschnittlich zu finden:

df1$MeanReturn=mapply(function(o,c) mean(df2$Return[o:c]), match(df1$OpenDate,df2$Date), match(df1$CloseDate,df2$Date)) 

Hier verwenden wir mapply die mean Funktion zur offenen anzuwenden und in der Nähe Zeilen im zweiten Datenrahmen df2, die df1$OpenDate bzw. df1$CloseDate entsprechen.

die Daten mit Ihnen zur Verfügung gestellten, df1 wird:

df1 
## individual OpenDate CloseDate MeanReturn 
##1   1 2010-01-04 2010-01-08 579.4000 
##2   2 2010-01-01 2010-01-08 535.8750 
##3   3 2010-01-03 2010-01-06 472.2500 
##4   4 2010-01-02 2010-01-05 602.7500 
##5   5 2010-01-04 2010-01-06 558.6667 

Daten:

df1 <- structure(list(individual = 1:5, OpenDate = structure(c(4L, 1L, 
3L, 2L, 4L), .Label = c("2010-01-01", "2010-01-02", "2010-01-03", 
"2010-01-04"), class = "factor"), CloseDate = structure(c(3L, 
3L, 2L, 1L, 2L), .Label = c("2010-01-05", "2010-01-06", "2010-01-08" 
), class = "factor"), MeanReturn = c(579.4, 535.875, 472.25, 
602.75, 558.666666666667)), .Names = c("individual", "OpenDate", 
"CloseDate", "MeanReturn"), row.names = c(NA, -5L), class = "data.frame") 
## individual OpenDate CloseDate MeanReturn 
##1   1 2010-01-04 2010-01-08 579.4000 
##2   2 2010-01-01 2010-01-08 535.8750 
##3   3 2010-01-03 2010-01-06 472.2500 
##4   4 2010-01-02 2010-01-05 602.7500 
##5   5 2010-01-04 2010-01-06 558.6667 

df2 <- structure(list(Date = structure(1:8, .Label = c("2010-01-01", 
"2010-01-02", "2010-01-03", "2010-01-04", "2010-01-05", "2010-01-06", 
"2010-01-07", "2010-01-08"), class = "factor"), Return = c(532L, 
645L, 213L, 567L, 986L, 123L, 567L, 654L)), .Names = c("Date", 
"Return"), class = "data.frame", row.names = c(NA, -8L)) 
##  Date Return 
##1 2010-01-01 532 
##2 2010-01-02 645 
##3 2010-01-03 213 
##4 2010-01-04 567 
##5 2010-01-05 986 
##6 2010-01-06 123 
##7 2010-01-07 567 
##8 2010-01-08 654 
+0

Danke für Ihre Antwort. Es funktioniert perfekt mit der Probe. Aber wenn ich versuche, es auf meine Hauptdaten zu verwenden, heißt es: "Fehler in o: c: NA/NaN Argument" Ich vermute es liegt daran, da NaN vorhanden ist: s beim Abgleich der Hauptdaten, aber nicht das Beispiel. Ist es möglich zu lösen? – Layte

+0

@Layte: Ja, das wird ein Problem sein. 'match' führen nur exakte Übereinstimmungen durch, so dass der Bereich von' Date' in 'df2' diejenigen in' OpenDate' und 'CloseDate' in' df1' enthalten muss. Was Sie tun sollten, ist (i) den Bereich von 'OpenDate' und' CloseDate' in 'df1' zu erhalten, (ii)' df2' mit diesem Bereich in Daten zu verschmelzen, so dass fehlende Daten 'Return' gleich' NA' haben , dann benutze das obige 'mapply' mit' mean (df2 $ Return [o: c], na.rm = TRUE) 'um die' NA' Werte im Mittel zu ignorieren. Ich werde die Antwort mit diesen Vorschlägen bearbeiten, aber es kann eine oder zwei Stunden dauern, bevor ich es tue. – aichao

+0

Sorry, es war mein Fehler. Nachdem ich die Daten gründlich analysiert hatte, bemerkte ich, dass ich einen Fehler gemacht hatte, als ich vorher Daten zurücklegte (ich entfernte versehentlich Freitage und hielt Samstage, an denen kein Handel stattfindet), so dass die Übereinstimmung für die Individuen am Freitag kein Rückgabedatum hatte mit. Das Anpassen hat alles gelöst und Ihr Code funktioniert einwandfrei. Ich danke dir sehr! – Layte

Verwandte Themen