根据面板数据中的变量值查找时间距离

时间:2017-08-28 06:04:37

标签: r dplyr time-series

让我们定义这两个变量,即当年的年度和冲突水平

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])
}

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

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

library(dplyr)

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

1 个答案:

答案 0 :(得分:0)

如果您对其他方法持开放态度,可以为每个和平时期创建一个指标,然后在每个时期使用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