让我们定义这两个变量,即当年的年度和冲突水平
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))
答案 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