2017-08-31 2 views
1

Ich versuche verzweifelt, eine Variable nach Gruppe zu verzögern. Ich fand this Post, die im Wesentlichen das gleiche Problem behandelt, mit dem ich konfrontiert bin, aber die Lösung funktioniert nicht für mich, keine Ahnung warum.Verzögerung Variable nach Gruppe funktioniert nicht in dplyr

Das ist mein Problem:

library(dplyr) 

df <- data.frame(monthvec = c(rep(1:2, 2), rep(3:5, 3))) 
df <- df %>% 
     arrange(monthvec) %>% 
     mutate(growth=ifelse(monthvec==1, 0.3, 
        ifelse(monthvec==2, 0.5, 
          ifelse(monthvec==3, 0.7, 
           ifelse(monthvec==4, 0.1, 
             ifelse(monthvec==5, 0.6,NA)))))) 

df%>% 
    group_by(monthvec) %>% 
    mutate(lag.growth = lag(growth, order_by=monthvec)) 

Source: local data frame [13 x 3] 
Groups: monthvec [5] 

monthvec growth lag.growth 
    <int> <dbl>  <dbl> 
1   1 0.3   NA 
2   1 0.3  0.3 
3   2 0.5   NA 
4   2 0.5  0.5 
5   3 0.7   NA 
6   3 0.7  0.7 
7   3 0.7  0.7 
8   4 0.1   NA 
9   4 0.1  0.1 
10  4 0.1  0.1 
11  5 0.6   NA 
12  5 0.6  0.6 
13  5 0.6  0.6 

Dies ist, was ich es am Ende sein soll:

df$lag.growth <- c(NA, NA, 0.3, 0.3, 0.5, 0.5, 0.5, 0.7,0.7,0.7, 0.1,0.1,0.1) 

    monthvec growth lag.growth 
1   1 0.3   NA 
2   1 0.3   NA 
3   2 0.5  0.3 
4   2 0.5  0.3 
5   3 0.7  0.5 
6   3 0.7  0.5 
7   3 0.7  0.5 
8   4 0.1  0.7 
9   4 0.1  0.7 
10  4 0.1  0.7 
11  5 0.6  0.1 
12  5 0.6  0.1 
13  5 0.6  0.1 

Ich glaube, dass ein Problem ist, dass meine Gruppen nicht gleich sind Länge ...

Danke für Ihre Hilfe.

+0

Was passiert, wenn "Wachstum" mehrere Werte in einem Monat hat? –

+0

Ich bin mir nicht sicher, ob ich das erreiche, worauf du abzielst ... – Thomas

Antwort

2

Hier ist eine Idee. Wir gruppieren uns nach monthvec, um die Anzahl der Zeilen (cnt) jeder Gruppe zu erhalten. Wir heben die Gruppierung auf und verwenden den ersten Wert von cnt als die Größe der Verzögerung. Wir gruppieren uns neu unter monthvec und ersetzen die Werte in jeder Gruppe durch den ersten Wert jeder Gruppe.

library(dplyr) 

df %>% 
group_by(monthvec) %>% 
mutate(cnt = n()) %>% 
ungroup() %>% 
mutate(lag.growth = lag(growth, first(cnt))) %>% 
group_by(monthvec) %>% 
mutate(lag.growth = first(lag.growth)) %>% 
select(-cnt) 

, die

# A tibble: 13 x 3 
# Groups: monthvec [5] 
    monthvec growth lag.growth 
     <int> <dbl>  <dbl> 
1  1 0.3   NA 
2  1 0.3   NA 
3  2 0.5  0.3 
4  2 0.5  0.3 
5  3 0.7  0.5 
6  3 0.7  0.5 
7  3 0.7  0.5 
8  4 0.1  0.7 
9  4 0.1  0.7 
10  4 0.1  0.7 
11  5 0.6  0.1 
12  5 0.6  0.1 
13  5 0.6  0.1 
1

Sie können beitreten Ihre Originaldaten mit einem Datenrahmen mit einer verschobenen "monthvec" gibt.

left_join(df, df %>% mutate(monthvec = monthvec + 1) %>% unique(), by = "monthvec") 

# monthvec growth.x growth.y 
# 1   1  0.3  NA 
# 2   1  0.3  NA 
# 3   2  0.5  0.3 
# 4   2  0.5  0.3 
# 5   3  0.7  0.5 
# 6   3  0.7  0.5 
# 7   3  0.7  0.5 
# 8   4  0.1  0.7 
# 9   4  0.1  0.7 
# 10  4  0.1  0.7 
# 11  5  0.6  0.1 
# 12  5  0.6  0.1 
# 13  5  0.6  0.1 
Verwandte Themen