2016-04-20 15 views
1

Ich habe einen Datenrahmen wie folgt, wo ich die Daten von grp und index gruppieren und Gruppe eine als Referenz für einige einfache Berechnungen verwenden möchten. Ich möchte die Variable value von einer anderen Gruppe von den Werten der Gruppe a subtrahieren.Operationen zwischen Gruppen mit dplyr

df <- data.frame(grp = rep(letters[1:3], each = 2), 
       index = rep(1:2, times = 3), 
       value = seq(10, 60, length.out = 6)) 

df 


## grp index value 
## 1 a  1 10 
## 2 a  2 20 
## 3 b  1 30 
## 4 b  2 40 
## 5 c  1 50 
## 6 c  2 60 

Die gewünschte outpout wäre wie:

## grp index value 
## 1 b  1 20 
## 2 b  2 20 
## 3 c  1 40 
## 4 c  2 40 

Meine Vermutung ist, wird es etwas in der Nähe sein:

group_by(df, grp, index) %>% 
    mutate(diff = value - value[grp == "a"]) 

Idealerweise würde ich es dplyr mit tun.

Grüße, Philippe

Antwort

1

Wir können filter für 'grp', die nicht 'a' sind und tun dann die Differenz innerhalb mutate.

df %>% 
    filter(grp!="a") %>% 
    mutate(value = value- df$value[df$grp=="a"]) 

Oder eine andere Option wäre join

df %>% 
    filter(grp!="a") %>% 
    left_join(., subset(df, grp=="a", select=-1), by = "index") %>% 
    mutate(value = value.x- value.y) %>% 
    select(1, 2, 5) 
# grp index value 
#1 b  1 20 
#2 b  2 20 
#3 c  1 40 
#4 c  2 40 
+1

Arbeiten wie erwartet sein. Vielen Dank. –

Verwandte Themen