2017-08-31 73 views
1

我拼命地试图按群组延迟变量。我发现this后处理基本上我面临的同样的问题,但解决方案不适合我,不知道为什么。由群组变量滞​​后不能在dplyr中工作

这是我的问题:

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 

这是想什么我它是在最后:

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 

我相信,一个问题是,我的组是不相等长度...

感谢您的帮助。

+0

如果'growth'在一个月内有多个值会发生什么? –

+0

我不知道如果我得到你想要的东西... – Thomas

回答

2

这是一个想法。我们按monthvec进行分组,以获得每组的行数(cnt)。我们取消组合并使用cnt的第一个值作为滞后的大小。我们重新组合monthvec并用每个组的第一个值替换每个组中的值。

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) 

赋予,

# 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

您可以用移位 “monthvec” 一个数据帧加入您的原始数据。

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