【问题标题】:Find temporal distance based on value of variable in panel data根据面板数据中变量的值查找时间距离
【发布时间】:2018-02-05 08:17:07
【问题描述】:

让我们定义这两个变量,用于年份和那一年的冲突程度

set.seed(28100)

years <- 1900:2010
conflict_lev <- sample(0:4, 111, replace = T, prob = c(0.9, 0.05, 0.03, 0.02, 0.01))

my_df <- data.frame(years, conflict_lev)

现在,对于每个 year,我想计算自上次 conflict_lev 大于 0 以来的年数。可以通过以下循环找到:

my_df$dist_last_conflict <- NA

for (i in 1:length(years)) {
  my_df$dist_last_conflict[i] <- min(years[i] - years[years < years[i] & conflict_lev > 0])
}

尽管如此,当我在变量group 中定义多个组时,我正在努力使用dplyr 创建dist_last_conflict

理想情况下,我应该能够定义一个函数findDistLastConflict(),得到与上面相同的结果并且没有循环:

library(dplyr)

my_df %>% 
group_by(group) %>% 
mutate(dist_last_conflict = findDistLastConflict(conflict_lev, years))

【问题讨论】:

    标签: r dplyr time-series


    【解决方案1】:

    如果您愿意接受其他方法,您可以为每个和平时期创建一个指标,然后在每个时期使用seq(1, n())

    my_df %>%
      mutate(peaceful.period = cumsum(conflict_lev!=0)) %>%
      group_by(peaceful.period) %>%
      mutate(dist_last_conflict = seq(1, n())-1) %>%
      ungroup() %>%
      select(-peaceful.period)
    
    # A tibble: 111 x 3
       years conflict_lev dist_last_conflict
       <int>        <int>              <dbl>
     1  1900            0                  0
     2  1901            0                  1
     3  1902            0                  2
     4  1903            0                  3
     5  1904            0                  4
     6  1905            0                  5
     7  1906            0                  6
     8  1907            0                  7
     9  1908            0                  8
    10  1909            0                  9
    # ... with 101 more rows
    

    【讨论】:

      猜你喜欢
      • 2018-05-18
      • 2018-10-10
      • 1970-01-01
      • 2016-03-24
      • 2016-06-29
      • 2022-06-16
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多