【问题标题】:Lagging variable by group does not work in dplyr按组的滞后变量在 dplyr 中不起作用
【发布时间】:2017-08-31 08:50:47
【问题描述】:

我正在拼命尝试按组滞后变量。我发现this 的帖子基本上处理了我面临的相同问题,但该解决方案对我不起作用,不知道为什么。

这是我的问题:

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

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

感谢您的帮助。

【问题讨论】:

  • 如果growth 在一个月内有多个值会怎样?
  • 我不确定我是否明白你的目标......

标签: r dplyr lag


【解决方案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

【讨论】:

    【解决方案2】:

    您可以将原始数据与带有“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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多