2016-04-21 6 views
4

So sieht mein Dataframe aus. Die rechte (vierte) Spalte ist meine gewünschte Spalte. Für einen bestimmten Namen versuche ich, die Punktzahl dieser Person vor 7 Tagen abzuleiten. Wenn vor genau 7 Tagen kein Datum existiert, möchte ich die Punktzahl, die mit dem nächsten Datum verknüpft ist (das Datum einer Zeile - 7 Tage).Abrufen einer Punktzahl für ein Datum "Around" vor 7 Tagen

library(data.table) 
dt <- fread(' 
    Name  Score  Date   ScoreAround7DaysAgo 
    John  9  2016-01-01  NA 
    John  6  2016-01-10  9 
    John  3  2016-01-17  6 
    John  5  2016-01-18  6 
    Tom  9  2016-01-01  NA 
    Tom  6  2016-01-10  9 
    Tom  3  2016-01-17  6 
    Tom  5  2016-01-18  6 
           ') 
dt[, Date := as.IDate(Date)] 

Ich habe dt[dt,roll=7+nearest] vergeblich versucht. Danke für Ihre Hilfe.

Antwort

5
dt[, val := .SD[.(Name = Name, Date = Date - 7), on = c('Name', 'Date'), roll = 'nearest', 
       c(NA, tail(Score, -1)), by = Name]$V1] 
dt 
# Name Score  Date ScoreAround7DaysAgo val 
#1: John  9 2016-01-01     NA NA 
#2: John  6 2016-01-10     9 9 
#3: John  3 2016-01-17     6 6 
#4: John  5 2016-01-18     6 6 
#5: Tom  9 2016-01-01     NA NA 
#6: Tom  6 2016-01-10     9 9 
#7: Tom  3 2016-01-17     6 6 
#8: Tom  5 2016-01-18     6 6 
+0

Danke für deine Antwort! – gibbz00

5

Dies funktioniert:

dt[, DateLag := Date - 7L ] 
w = dt[dt, which = TRUE, on = c("Name", Date = "DateLag"), roll = "nearest"] 

dt[ , `:=`(ScoreLag = Score[replace(w, w == .I, NA_integer_)], DateLag = NULL)] 


    Name Score  Date ScoreAround7DaysAgo ScoreLag 
1: John  9 2016-01-01     NA  NA 
2: John  6 2016-01-10     9  9 
3: John  3 2016-01-17     6  6 
4: John  5 2016-01-18     6  6 
5: Tom  9 2016-01-01     NA  NA 
6: Tom  6 2016-01-10     9  9 
7: Tom  3 2016-01-17     6  6 
8: Tom  5 2016-01-18     6  6 

Sie den nächsten Termin Date-7 findet, sondern verwirft sie, wenn sie die gleichen Date wieder an sind.

+0

Vielen Dank Frank für Ihre Antwort. Ich erhalte einen Fehler "Fehler in forderv (x, by = rightcols): " durch "Wert -2147483648 außerhalb des Bereichs [1,5]", wenn ich die zweite Zeile ausführe. Ich habe auch Datum Datentypen von Zeichen zu Datum ändern für die erste Zeile zu laufen. – gibbz00

+0

Ich habe bereits Ihre Frage geändert, so dass dort ein Datum ist (kann keinen Grund sehen, ein Zeichen zu verwenden). Läuft die Version 1.9.6+ des Pakets? Ich denke, es sollte funktionieren. (Ich habe 'IDate' anstelle von' Date' verwendet, aber ich denke nicht, dass das wichtig sein sollte.) – Frank

+0

Danke Frank. Ich habe R von 3.2.3 auf 3.2.5 aktualisiert, aber immer noch einen Fehler. Meine Daten.Tabelle ist 1.9.6. Wenn ich Date = 'DatelLag "nur auf Datelag ändere, läuft es, aber alle NAs erscheinen im Ergebnissatz. Ich vermisse etwas. Aber vielen Dank für die Antwort. – gibbz00

Verwandte Themen