【发布时间】: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产生什么? -
我认为您不想同时按
ID和Year分组?这是你想要的吗?MyData %>% group_by(ID) %>% mutate(var3 = var1 - dplyr::lag(var2))