按组滞后变量在 dplyr 中不起作用

Lagging variable by group does not work in dplyr

我拼命地试图按组滞后一个变量。我发现 post 处理的问题与我面临的问题基本相同,但该解决方案对我不起作用,不知道为什么。

这是我的问题:

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

我认为一个问题是我的组长度不等...

感谢您的帮助。

这是一个想法。我们按 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

您可以将您的原始数据与具有移位 "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