2015-06-02 14 views
15

In R, lassen Sie uns sagen, dass ich diesen Datenrahmen haben:In R, subtrahieren Wert der vorherigen R., von der Gruppe und das Datum

Data 
id  date  value 
2380 10/30/12 21.01 
2380 10/31/12 22.04 
2380 11/1/12  22.65 
2380 11/2/12  23.11 
20100 10/30/12 35.21 
20100 10/31/12 37.07 
20100 11/1/12  38.17 
20100 11/2/12  38.97 
20103 10/30/12 57.98 
20103 10/31/12 60.83 

Und ich möchte den vorherigen Wert aus dem aktuellen Wert von Gruppen-ID subtrahieren Datum, an diese erstellen:

id  date  value diff 
2380 10/30/12 21.01 0 
2380 10/31/12 22.04 1.03 
2380 11/1/12  22.65 0.61 
2380 11/2/12  23.11 0.46 
20100 10/30/12 35.21 0 
20100 10/31/12 37.07 1.86 
20100 11/1/12  38.17 1.1 
20100 11/2/12  38.97 0.8 
20103 10/30/12 57.98 0 
20103 10/31/12 60.83 2.85 

Antwort

15

Sie dies mit der Funktion ave tun können:

data$diff <- ave(data$value, data$id, FUN=function(x) c(0, diff(x))) 
data 
#  id    date value diff 
# 1 2380 2012-10-30 00:15:51 21.01 0.00 
# 2 2380 2012-10-31 00:31:03 22.04 1.03 
# 3 2380 2012-11-01 00:16:02 22.65 0.61 
# 4 2380 2012-11-02 00:15:32 23.11 0.46 
# 5 20100 2012-10-30 00:15:38 35.21 0.00 
# 6 20100 2012-10-31 00:15:48 37.07 1.86 
# 7 20100 2012-11-01 00:15:49 38.17 1.10 
# 8 20100 2012-11-02 00:15:19 38.97 0.80 
# 9 20103 2012-10-30 10:27:34 57.98 0.00 
# 10 20103 2012-10-31 12:24:42 60.83 2.85 

Das erste Argument sind die Daten, die bearbeitet werden sollen, das zweite Argument ist die Gruppe und das letzte Argument ist die Funktion, die auf die Daten jeder Gruppe angewendet wird.

+0

Hallo, ich weiß, es ist schon lange da diese Antwort geschrieben wurde, aber das funktioniert super! Stört es Sie zu erklären, was hier getan wird? – asterx

+0

@asterx Wie der letzte Satz in der Antwort besagt, nimmt dies die Wertvariable, gruppiert sie durch die ID-Variable und ruft dann die übergebene Funktion für die Daten für jede Gruppe auf. In diesem Fall gibt die übergebene Funktion 0 zurück, gefolgt von der Differenz zwischen jedem aufeinanderfolgenden Wert innerhalb der Gruppe. – josliber

+0

Danke! '' 'diff (x)' '' gibt im Grunde einen Vektor 1 kürzer als seine Eingabe zurück, die mit 0 als Überschriftselement kombiniert wird, um dieselbe Größe zu erhalten. Ich habs. – asterx

33

Mit dplyr:

library(dplyr) 

data %>% 
    group_by(id) %>% 
    arrange(date) %>% 
    mutate(diff = value - lag(value, default=first(value))) 

Mit data.table:

library(data.table) 

dt <- as.data.table(data) 
dt[, diff := value - shift(value, fill=first(value)), by=id] 
+0

Hallo @ Zero323, ich versuche, Ihre Lösung auf das gleiche Problem anzuwenden, aber irgendwie bekomme ich nur Nullen in der Spalte "diff". Irgendeine Idee darüber, was passieren könnte? – Lucas

+0

@Lucas Nur Artikel pro Gruppe wäre meine erste Schätzung. – zero323

+0

Danke @ zero323 – Lucas

Verwandte Themen