Comment remplir différentes valeurs dans une nouvelle colonne en fonction des différentes valeurs d'une autre colonne à l'aide de dplyr ?


Feng Chen

Voici mes données :

a <- data.frame(x=c('A','A','A','B','B','B'),
                y=c('Yes','No','No','Yes','No','No'),
                z=c(1,2,3,4,5,6))

Je veux générer une nouvelle colonne de cette façon :

  1. Grouper par x, donc tous les As seront dans un groupe et tous les Bs dans un autre
  2. Pour chaque groupe, si y=Yes, conservez la zvaleur dans la nouvelle colonne. Si y=No, alors en utilisant la zvaleur avec y=Yes.

Ainsi, les nouvelles données devraient ressembler à ceci :

x    y   z   z1
A   Yes  1   1
A   No   2   1
A   No   3   1
B   Yes  4   4
B   No   5   4
B   No   6   4

Je peux utiliser cette façon de faire :

a1 <- a %>%
   filter(y=='Yes') %>%
   distinct(x,y,z)
 a2 <- a %>%
    left_join(a1,by='x') %>%...

Mais de cette façon, je dois générer a1en tant qu'intermédiaire. Comment faire cela dans un seul pipeline sans générer de nouvelle variable comme a1dans mon exemple ?

ist123

Vous pouvez combiner les deux pipelines et exécuter les mêmes fonctions en une seule fois.

c'est à dire..

    a <- data.frame(x=c('A','A','A','B','B','B'),
                    y=c('Yes','No','No','Yes','No','No'),
                    z=c(1,2,3,4,5,6))

    a %>% left_join(a %>% filter(y=='Yes') %>% distinct(x,y,z), by='x') %>% select(-y.y)

Cela se traduit par des colonnes en double marquées avec .x et .y à la suite de la jointure.

Articles connexes