2017-08-31 9 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 

私は1つの問題は、私のグループは同じではないことであると信じています長さ...

ありがとうございます。

+0

「成長」に1か月に複数の値があるとどうなりますか? –

+0

私はあなたが目指しているものを得るかどうかわからない... – Thomas

答えて

2

ここにアイデアがあります。各グループの行数(cnt)を得るには、monthvecでグループ化します。最初の値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 
関連する問題