【问题标题】:Create time event based dummy variable in R - leads & lags在 R 中创建基于时间事件的虚拟变量 - 领先和滞后
【发布时间】:2018-07-01 11:40:43
【问题描述】:

我目前正在寻找一种方法来创建一组虚拟变量,以指示面板中的时间事件。明确地说,我正在尝试制作虚拟变量来指示事件发生前 20 年和事件发生后 20 年的事件,例如20 年内战争对贸易的影响。我想为 dyads 中的每个合作伙伴编写这个假人。如何优雅地对这些事件假人进行编程?我会很感激你的帮助:)

   iso_o iso_d year mid_o mid_d
  ABW   AFG 1980     0     1
  ABW   AFG 1981     0     1
  ABW   AFG 1982     0     1
  ABW   AFG 1983     0     2
  ABW   AFG 1984     0     1
  ABW   AFG 1985     0     1
  ABW   AFG 1986     0     1
  ABW   AFG 1987     0     1
  ABW   AFG 1988     0     0
  ABW   AFG 1989     0     1

所以这就是我想去的地方:

   iso_o iso_d year mid_o mid_d mid_o_t-20 mid_o_t-19 mid o_t-18 .... mid_d_t-20 
  ABW   AFG 1980     0     1     0          0           0 
  ABW   AFG 1981     0     1     0          0           0 
  ABW   AFG 1982     0     1     0          0           0 
  ABW   AFG 1983     0     2     0          0           0 
  ABW   AFG 1984     0     1     0          0           0  
  ABW   AFG 1985     0     1     0          0           0

【问题讨论】:

  • 如果您提供a complete minimal reproducible example 来回答您的问题,我们更有可能为您提供帮助。我们可以从中工作并使用它来向您展示如何回答您的问题。证明你已经付出了一些努力通常是件好事。
  • 感谢您的帮助。我找到了解决问题的方法。

标签: r variables events time panel


【解决方案1】:

我在这里假设da.fdata.frame 的缩写,与已知函数没有冲突)大致遵循您的结构,因为您没有将其包含在问题中。

library(zoo)
#da.f is randomly generated in this example
da.f = data.frame(mid_o = sample(seq(0,4), 50, replace = TRUE), mid_d = sample(seq(0,4), 50, replace = TRUE))
#our result consists of 20 lags backward and forward in time 
res = lag(as.zoo(da.f), -20:20, na.pad = TRUE)

2018 年 5 月 10 日it was pointed to me by @thistleknot (thanks!) that dplyr masks stats's own lag generic。因此,请确保您没有附加dplyr,或者改为显式运行stats::lag,否则我的代码将无法运行。

我想我找到了罪魁祸首:github.com/tidyverse/dplyr/issues/1586 答案:这是拥有大量 R 包的自然结果。 只需明确并使用 stats::lag 或 dplyr::lag

【讨论】:

  • 感谢您的帮助!您的帮助使我朝着正确的方向前进!我找到了解决我的问题的方法。附言。由于滞后和班次只取正数,我不得不创建滞后和领先,再添加 2 行代码。
  • @NikolaiKI 很好,lag 接受消极和积极的输入。唉,我的解决方案需要一行代码,并且生成的列很容易按照您的需要命名。尽管如此,请考虑支持/接受它,很高兴它对您有所帮助;)
  • 不知何故我的 R Suite 不想要它!我得到错误:不接受负整数。此外,我遇到了一个问题,即矩阵占用了 RAM,我从 2008 年开始在大学 PC 上编程。因此 data.table 方法更方便。 ps:不幸的是,我不能在moemt上投票:我没有足够的声誉:(
  • @NikolaiKl 您是否安装了zoo,加载它并使用as.zoo 转换您的时间序列?
  • @NikolaiKl 这是它返回给我的结果:gist.github.com/bhvieira/92486224815cfd65ef03314a7ee6fea4 你确定在我的答案中运行代码时不会抛出错误或警告吗?
【解决方案2】:

您好,感谢您的帮助!

我找到了问题的解决方案:我必须首先将 data.frame 转换为 data.table。其次,我找到了一种在 data.table 中结合命令sprintifshift 创建多列的方法。 Therby 我可以在 4 行代码中创建 20 个滞后和 20 个领先。

df[, sprintf("mid_o_lag_%0d", 1:20) := shift(mid_o, c(1:20), type = 'lag')]
df[, sprintf("mid_d_lag_%0d", 1:20) := shift(mid_d, c(1:20), type = 'lag')]
df[, sprintf("mid_o_lead_%0d", 1:20) := shift(mid_o, c(1:20), type = 'lead')]
df[, sprintf("mid_d_lead_%0d", 1:20) := shift(mid_d, c(1:20), type = 'lead')]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 2023-03-24
    • 2020-09-02
    • 2017-05-31
    • 2013-08-31
    • 2020-10-19
    • 1970-01-01
    • 2019-12-09
    相关资源
    最近更新 更多