2017-06-20 2 views
0

je la df suivante:R - test si la valeur est la même que celle de la cellule au-dessus

name color 
A  red 
B  red 
C  green 
D  red 
E  red 
F  red 

Et je veux tester les valeurs dans la colonne « couleur » pour voir si elles sont les mêmes que les valeurs de la ligne ci-dessus et à écrire une nouvelle colonne ... je peux le faire en utilisant les éléments suivants:

> df$same <- ifelse(df$color == df$color[c(NA,1:(nrow(df)-1))], 1, 0) 

pour me donner:

name color same 
A  red  NA 
B  red  1 
C  green  0 
D  red  0 
E  red  1 
F  red  1 

Mais est-il moyen plus propre de le faire? (Je l'utilise tout le temps) ...

+1

Probablement pas plus propre, mais voici une alternative: 'as.integer (c (NA, diff (as.integer (dat $ color)) == 0)) '. – lmo

Répondre

1

Vous pouvez essayer la fonction lag du paquet dplyr. Vous pouvez créer une nouvelle colonne avec les valeurs de la ligne ci-dessus et après les comparer,

> dt$color_above <- lag(dt$color, n=1) 

> dt 

    name color color_above 
1 A red  <NA> 
2 B red   red 
3 C green   red 
4 D red  green 
5 E red   red 
6 F red   red 

Ou résoudre le problème directement, vous pouvez utiliser les pipe-opérateurs du paquet magrittr. C'est toujours verbeux, mais je pense que ça garde le code plus clair.

> dt %$% 
    { color == lag(color, n=1) } %>% 
    as.numeric() %>% 
    {.} -> dt$same 

> dt 

    name color same 
1 A red NA 
2 B red 1 
3 C green 0 
4 D red 0 
5 E red 1 
6 F red 1 
0

Ajout à la réponse de Rafael, vous pouvez utiliser ifelse avec dplyr::mutate:

> dt <- data_frame(name = c('A', 'B', 'C', 'D', 'E', 'F'), color = c('red', 'red', 'green', 'red', 'red', 'red')) 
> dt 
# A tibble: 6 x 2 
    name color 
    <chr> <chr> 
1  A red 
2  B red 
3  C green 
4  D red 
5  E red 
6  F red 
> dt %>% mutate(same = ifelse(color == lag(color), 1, 0)) 
# A tibble: 6 x 3 
    name color same 
    <chr> <chr> <dbl> 
1  A red NA 
2  B red  1 
3  C green  0 
4  D red  0 
5  E red  1 
6  F red  1