【问题标题】:Why does dplyr 0.8.3 still produce NA with lag operator and grouped data?为什么 dplyr 0.8.3 仍然会产生带有滞后运算符和分组数据的 NA?
【发布时间】:2020-03-06 12:22:33
【问题描述】:

我想用 dplyr 在我的分组数据中滞后一个变量。我使用lag 运算符。我发现了类似dplyr lag function returns NAs 这样的问题,有人将https://github.com/tidyverse/dplyr/issues/1540 指向 Hadley 在 2016 年修复的一些错误。所以,我认为它已经解决了。为什么我的 lag 命令仍然抛出 NA?

我使用 R 版本 3.6.1 和 dplyr_0.8.3。

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

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我认为您只是没有正确使用 order_by 参数。它应该采用另一个向量,而不是 TRUE 或 FALSE。在您的用例中,您可能根本不想使用它。

    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
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 2021-05-01
      • 1970-01-01
      • 2014-05-09
      相关资源
      最近更新 更多