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