2017-10-21 46 views
0

J'essaie de créer une nouvelle colonne conditionnellement à plusieurs autres colonnes. Voici mes données. J'essaye de créer une colonne de différence d'année en année.calculer la colonne conditionnelle sur d'autres colonnes r

> person <- c(rep("A", 4), rep("B", 1), rep("C",3), rep("D",1)) 
> score <- c(1,1,2,4,1,1,2,2,3) 
> year <- c(2017, 2016, 2015, 2014, 2015, 2017, 2015, 2014, 2017) 

Cette fonction recherche les données de l'année précédente pour cette personne et ce score à partir de leur score actuel. S'il n'y a pas de données de l'année précédente, il renvoie NA. Donc, pour mes données, j'obtiendrais une nouvelle colonne "différence" qui a des valeurs 0, -1, -2, NA, NA, NA, 0, NA, NA.

Aimerait voir réponse dplyr, mais vanilla r solutions bienvenue.

Répondre

2

En utilisant dplyr

library(dplyr) 
df %>% 
    arrange(person, year) %>% 
    group_by(person) %>% 
    mutate(per = ifelse(year - lag(year) == 1, score - lag(score), NA)) %>% 
    arrange(person, -year) 

# A tibble: 9 x 4 
# Groups: person [4] 
    person score year per 
    <fctr> <dbl> <dbl> <dbl> 
1  A  1 2017  0 
2  A  1 2016 -1 
3  A  2 2015 -2 
4  A  4 2014 NA 
5  B  1 2015 NA 
6  C  1 2017 NA 
7  C  2 2015  0 
8  C  2 2014 NA 
9  D  3 2017 NA 
+0

l'esprit me promener à travers la syntaxe? donner à un homme un poisson vs enseigner à un homme à pêcher .... – AZhao

+0

@AZhao quelle partie vous a troublé? – Wen

+2

@AZhao réalisé, vous êtes un utilisateur de python, donc mon début d'explication de python à R, 'R lag = Python shift' ' R group_by = Python groupby' 'R ifesle = Python np.where' ' R arrange = Python sort_values' – Wen