代码之家  ›  专栏  ›  技术社区  ›  Marco

为什么dplyr 0.8.3仍然使用lag运算符和分组数据生成NA?

  •  0
  • Marco  · 技术社区  · 4 年前

    我想用dplyr延迟分组数据中的变量。我用 lag dplyr lag function returns NAs 有人指出 https://github.com/tidyverse/dplyr/issues/1540 哈雷在2016年修正了一些错误。所以,我想已经解决了。为什么我的延迟命令仍然抛出NA?

    library(tidyverse)
    
    data = data.frame(id=c(1,1,1,2,2,2,3,3,3,4,4,4), time=seq(1:3), x=rep(c(5:8), each=3))
    
    data %>%
      group_by(id) %>%
      mutate(x_lag = lag(x, n=1, default=NA, order_by=TRUE)) %>% 
      select(id, time, x, x_lag) 
    
    data %>%
      group_by(id) %>%
      mutate(x_lag = lag(x, n=1, default=NA, order_by=FALSE)) %>% 
      select(id, time, x, x_lag) 
    
    data %>%
      group_by(id) %>%
      arrange(id) %>%
      mutate(x_lag = lag(x, n=1, default=NA, order_by=FALSE)) %>% 
      select(id, time, x, x_lag) 
    
    data %>%
      group_by(id) %>%
      mutate(x_lag = lag(x, n=1, default=0, order_by=TRUE)) %>% 
      select(id, time, x, x_lag) 
    
    # A tibble: 8 x 4
    # Groups:   id, time [12]
          id  time     x x_lag
       <dbl> <int> <int> <int>
     1     1     1     5    NA
     2     1     2     5    NA
     3     1     3     5    NA
     4     2     1     6    NA
     5     2     2     6    NA
     6     2     3     6    NA
     7     3     1     7    NA
     8     3     2     7    NA
    
    1 回复  |  直到 4 年前
        1
  •  1
  •   Allan Cameron    4 年前

    我想你只是没有用 order_by

    data %>%
      group_by(id) %>%
      mutate(x_lag = lag(x, n=1, default=0)) %>% 
      select(id, time, x, x_lag) 
    #> # A tibble: 12 x 4
    #> # Groups:   id [4]
    #>       id  time     x x_lag
    #>    <dbl> <int> <int> <dbl>
    #>  1     1     1     5     0
    #>  2     1     2     5     5
    #>  3     1     3     5     5
    #>  4     2     1     6     0
    #>  5     2     2     6     6
    #>  6     2     3     6     6
    #>  7     3     1     7     0
    #>  8     3     2     7     7
    #>  9     3     3     7     7
    #> 10     4     1     8     0
    #> 11     4     2     8     8
    #> 12     4     3     8     8