【问题标题】:Computing lags but grouping by two categories with dplyr计算滞后,但使用 dplyr 按两个类别分组
【发布时间】:2023-03-28 17:45:01
【问题描述】:

我想要的是使用滞后(dplyr 包)创建 var3,但应该与年份和 ID 保持一致。我的意思是,滞后应该属于相应的ID。数据集就像一个不平衡的面板。

YEAR ID VARS
2010 1 -
2011 1 -
2012 1 -
2010 2 -
2011 2 -
2012 2 -
2010 3 -
... 

我的问题类似于以下问题/帖子,但按两个类别分组:

dplyr: lead() and lag() wrong when used with group_by()

我尝试扩展解决方案,但未成功(我收到 NAs)。

尝试 #1:

data %>%
  group_by(YEAR,ID) %>%
  summarise(var1 = ...
            var2 = ...
            var3 = var1 - dplyr::lag(var2))
  )

尝试 #2:

data %>%
  group_by(YEAR,ID) %>%
  summarise(var1 = ...
            var2 = ...
            gr = sprintf(YEAR,ID)
            var3 = var1 - dplyr::lag(var2, order_by = gr))
  )

最小示例:


MyData <- 
data.frame(YEAR = rep(seq(2010,2014),5),
           ID = rep(1:5, each=5),
           var1 = rnorm(n=25,mean=10,sd=3),
           var2 = rnorm(n=25,mean=1,sd=1)
           )

MyData %>%
  group_by(YEAR,ID) %>%
  summarise(var3 = var1 - dplyr::lag(var2)
  )

提前致谢。

【问题讨论】:

  • 您的尝试有哪些不成功的地方?第一个看起来和我预期的一样。拥有一些我们可以使用的数据以及您对该样本数据的预期输出可能会有所帮助。谢谢
  • @r2evans 我得到了 NA。我更新了帖子以添加示例。谢谢。
  • 如果您进行滞后或领先操作,您将始终获得NA 值,除非您指定lag(..., default=) 值。想一想:您对dplyr::lag(1:3) 有什么期望 ...第二个和第三个值是1:2,但第一个值是什么?
  • 具体到这个......你的group_by有效地将它变成了一个逐行(或rowwise())的操作。当你有单行 YEAR=2010,ID=1 时,你期望 lag 产生什么?
  • 我认为您不想同时按IDYear 分组?这是你想要的吗? MyData %&gt;% group_by(ID) %&gt;% mutate(var3 = var1 - dplyr::lag(var2))

标签: r dplyr


【解决方案1】:

您的意思是group_by(ID) 并且实际上是“按年订购”吗?

MyData  %>%
  group_by(ID) %>%
  mutate(var3 = var1 - dplyr::lag(var2)) %>%
  print(n=99)
# # A tibble: 25 x 5
# # Groups:   ID [5]
#     YEAR    ID  var1    var2  var3
#    <int> <int> <dbl>   <dbl> <dbl>
#  1  2010     1 11.1   1.16   NA   
#  2  2011     1 13.5  -0.550  12.4 
#  3  2012     1 10.2   2.11   10.7 
#  4  2013     1  8.57  1.43    6.46
#  5  2014     1 12.6   1.89   11.2 
#  6  2010     2  8.87  1.87   NA   
#  7  2011     2  5.30  1.70    3.43
#  8  2012     2  6.81  0.956   5.11
#  9  2013     2 13.3  -0.0296 12.4 
# 10  2014     2  9.98 -1.27   10.0 
# 11  2010     3  8.62  0.258  NA   
# 12  2011     3 12.4   2.00   12.2 
# 13  2012     3 16.1   2.12   14.1 
# 14  2013     3  8.48  2.83    6.37
# 15  2014     3 10.6   0.190   7.80
# 16  2010     4 12.3   0.887  NA   
# 17  2011     4 10.9   1.07   10.0 
# 18  2012     4  7.99  1.09    6.92
# 19  2013     4 10.1   1.95    9.03
# 20  2014     4 11.1   1.82    9.17
# 21  2010     5 15.1   1.67   NA   
# 22  2011     5 10.4   0.492   8.76
# 23  2012     5 10.0   1.66    9.51
# 24  2013     5 10.6   0.567   8.91
# 25  2014     5  5.32 -0.881   4.76

(暂时忽略您的summarizemutate。)

【讨论】:

  • 是的。综上,把函数改成mutate,只按ID分组。非常感谢。
猜你喜欢
  • 2020-11-06
  • 1970-01-01
  • 2019-09-05
  • 2019-04-26
  • 1970-01-01
  • 2015-04-13
  • 2014-05-11
  • 1970-01-01
相关资源
最近更新 更多