2016-04-20 10 views
3

Mit diesem data.framedplyr: Unterschied der Werte zwischen Ende Jahr und starten Jahr

siteID <- c(rep("site1", 16), rep("site2", 16), rep("site3", 16),rep("site4", 16)) 
YEAR <- rep(c("2003", "2004", "2005", "2006"), 16) 
parameter <- c(rep("A", 4), rep("B", 4), rep("C", 4), rep("D", 4), 
       rep("A", 4), rep("B", 4), rep("C", 4), rep("D", 4), 
       rep("A", 4), rep("B", 4), rep("C", 4), rep("D", 4), 
       rep("A", 4), rep("B", 4), rep("C", 4), rep("D", 4)) 
value <- c(seq(1, 4, by=1), seq(10, 40, by=10), seq(12, 18, by=2), seq(5, 20, by=5), 
      seq(3, 12, by=3), sample(13:18, 4), sample(15:22, 4), sample(10:18, 4), 
      seq(7, 1, by=-2), sample(15:22, 4), sample(15:19, 4), sample(10:20, 4), 
      seq(8, 5, by=-1), seq(50, 20, by=-10), seq(16, 10, by=-2), seq(20, 5, by=-5)) 
df <- data.frame(siteID, parameter, YEAR, value) 

head(df, 20) 
> head(df, 20) 
    siteID parameter YEAR value 
1 site1   A 2003  1 
2 site1   A 2004  2 
3 site1   A 2005  3 
4 site1   A 2006  4 
5 site1   B 2003 10 
6 site1   B 2004 20 
7 site1   B 2005 30 
8 site1   B 2006 40 
9 site1   C 2003 12 
10 site1   C 2004 14 
11 site1   C 2005 16 
12 site1   C 2006 18 
13 site1   D 2003  5 
14 site1   D 2004 10 
15 site1   D 2005 15 
16 site1   D 2006 20 
17 site2   A 2003  3 
18 site2   A 2004  6 
19 site2   A 2005  9 
20 site2   A 2006 12 

ich den Unterschied in Wert für jeden Parameter zwischen dem Ende Jahr und beginnen Jahr erhalten möchten.

Das Ergebnis wie dieses

siteID parameter difference 
site1   A  3 
site1   B  30 
site1   C  6 
site1   D  15 

aussehen Wenn die Daten aus Langformat zu Breitformat umgewandelt wurde, das durch Subtraktion des Startjahres-Säule (2003) von Ende Jahr Säule (2006) getan werden könnte.

Allerdings würde ich es gerne mit dplyr tun und ohne die Daten in Wide Format zu konvertieren.

Irgendwelche Vorschläge würden geschätzt.

Antwort

4

Wir gruppieren nach 'siteID', 'parameter' und erhalten die Differenz zwischen 'value', die maximal 'YEAR' und Minimum 'YEAR' entspricht. Die which.max und which.min gibt den Zeilenindex der maximalen/minimalen Werte von 'YEAR' zurück.

res <- df %>% 
     group_by(siteID, parameter) %>% 
     summarise(difference = value[which.max(YEAR)]-value[which.min(YEAR)]) 
head(res, 4) 
# siteID parameter difference 
# (fctr) (fctr)  (dbl) 
#1 site1   A   3 
#2 site1   B   30 
#3 site1   C   6 
#4 site1   D   15 
+1

Vielen Dank für Ihre Zeit und Hilfe. – aelwan