2017-08-28 4 views
0

Définissons ces deux variables, pour l'année et le niveau de conflit dans cette annéeTrouver la distance temporelle basée sur la valeur de la variable dans les données du panneau

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) 

Maintenant, pour chaque year Je veux calculer le nombre d'années écoulées depuis la dernière fois conflict_lev était plus de 0. cela peut être trouvé avec cette boucle:

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

Néanmoins, je me bats pour créer dist_last_conflict avec dplyr et quand j'ai plusieurs groupes tels que définis dans lavariables.

Idéalement, je devrais être en mesure de définir une fonction findDistLastConflict() qui obtiennent le même résultat que ci-dessus et sans boucle:

library(dplyr) 

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

Répondre

0

Si vous êtes ouvert à des approches alternatives, vous pouvez créer un indicateur pour chaque période de paix, puis utiliser seq(1, n()) avec chaque période:

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