查找面板数据上次更改以来的累计值更改和时间

问题描述

我有面板数据(以下是数据的小示例),并且想要计算变量何时发生变化以及从上次发生变化起的时间。最终目标是获得两个变量:任何给定年份的累积变化(即当前值和起始值之间的差)以及自上次变化以来的时间。

# example data
structure(list(rcode = c("DE1","DE1","DE2","DE2"),n_RAI = c(34.47871,34.91596,34.88745,34.79049,35.48414,35.98985,36.98985,34.47871,36.98985),year = c(2000L,2001L,2002L,2003L,2004L,2005L,2006L,2007L,2008L,2009L,2010L,2000L,2010L)),row.names = 375:396,class = "data.frame")

在此数据中,r_code是个人标识符,n_RAI是我要滞后的变量,year是时间变量。

使用答案here,可以很容易地确定面板中每个人的更改时间。

我要努力解决的问题是,使用dplyr::group_bytapply应用于面板中的各个人,该函数还可以计算自上次更改以来的时间。本质上,我需要一个函数来标识何时发生更改,开始向前递增计数,然后在发生另一个更改时重置。看起来很简单,但是我遇到了一些障碍,无法思考如何将其转换为R。我是否没有看到一个函数或简单的基本R方式来做到这一点? >

例如DE1的预期输出,使用“ change”作为变量名称来标识更改,并使用“ t_since”作为上次更改的时间:

change = 0,1,0
t_since = 0,2,3,2

解决方法

我认为这可行。这有点令人费解。 t_since结果与您想要的结果相符,change列与您在问题中显示的内容略有不同,但是我认为这可能是您的问题中的错字。 (调用您的数据dd。)

dd = dd %>%
  group_by(rcode) %>%
  mutate(
    change = c(0,abs(diff(n_RAI)) > 1e-8),grouper = (cumsum(change) - 1) %/% 2
  ) %>%
  group_by(rcode,grouper) %>%
  mutate(t_since = pmax(0,0:(n() - 1))) %>%
  ungroup() %>%
  select(-grouper)

change = c(0,1,0)
t_since = c(0,2,3,2)

dd = cbind(dd,goal_change = change,goal_t_since = t_since)

all(dd$goal_change == dd$change)
# [1] FALSE
all(dd$goal_t_since == dd$t_since)
# [1] TRUE

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...