7
votes

dplyr supprimer les occurrences suivantes de valeur d'une valeur dans un groupe

J'ai récemment cherché des conseils sur la manière de supprimer toutes les premières occurrences d'une valeur dans un groupe à l'aide de dplyr ( DLYR Ouvrez tous sauf les premières occurrences d'une valeur dans un groupe ).

La solution était vraiment intelligente et maintenant, je me lance de trouver quelque chose de tout aussi efficace au cas où je devrais supprimer uniquement les n valeurs suivantes. P>

Par exemple, dans le code ci-dessous, je crée une nouvelle colonne "Tag": P>

library('dplyr')
data(iris)
set.seed(1)
iris$tag <- sample(c(0,1), 150, replace=TRUE, prob = c(0.7, 0.3))
giris <- iris %>% group_by(Species)

# Source: local data frame [150 x 6]
# Groups: Species [3]
# 
#    Sepal.Length Sepal.Width Petal.Length Petal.Width Species   tag
#           (dbl)       (dbl)        (dbl)       (dbl)  (fctr) (dbl)
# 1           5.1         3.5          1.4         0.2  setosa     0
# 2           4.9         3.0          1.4         0.2  setosa     0
# 3           4.7         3.2          1.3         0.2  setosa     0
# 4           4.6         3.1          1.5         0.2  setosa     1
# 5           5.0         3.6          1.4         0.2  setosa     0
# 6           5.4         3.9          1.7         0.4  setosa     1
# 7           4.6         3.4          1.4         0.3  setosa     1
# 8           5.0         3.4          1.5         0.2  setosa     0
# 9           4.4         2.9          1.4         0.2  setosa     0
# 10          4.9         3.1          1.5         0.1  setosa     0
# ..          ...         ...          ...         ...     ...   ...


2 commentaires

Donc, s'il y a une séquence 0 0 1 1 1 1 1, il devrait devenir 0 0 1 0 0 1 0?


@ Frank exactement, c'est la sortie attendue


3 Réponses :


4
votes

Je ne peux pas penser à un meilleur moyen de le faire qu'une boucle:

flip_followers = function(tag, nf = 2L){
    w    = which(tag==1L)
    keep = rep(TRUE, length(w))
    for (i in seq_along(w)) if (keep[i]) keep[match(w[i]+seq_len(nf), w)] = FALSE
    tag[w[!keep]] = 0L
    tag
}

giris %>% mutate(tag = flip_followers(tag))



Source: local data frame [150 x 6]
Groups: Species [3]

   Sepal.Length Sepal.Width Petal.Length Petal.Width Species   tag
          (dbl)       (dbl)        (dbl)       (dbl)  (fctr) (dbl)
1           5.1         3.5          1.4         0.2  setosa     0
2           4.9         3.0          1.4         0.2  setosa     0
3           4.7         3.2          1.3         0.2  setosa     0
4           4.6         3.1          1.5         0.2  setosa     1
5           5.0         3.6          1.4         0.2  setosa     0
6           5.4         3.9          1.7         0.4  setosa     0
7           4.6         3.4          1.4         0.3  setosa     1
8           5.0         3.4          1.5         0.2  setosa     0
9           4.4         2.9          1.4         0.2  setosa     0
10          4.9         3.1          1.5         0.1  setosa     0
..          ...         ...          ...         ...     ...   ...


2 commentaires

Merci, @frank. J'ai suscité depuis c'est une solution. Dans le même temps, je suis toujours curieux de savoir si quelqu'un peut proposer une idée réalisable dplyr.


@RPL Merci pour les commentaires. DplyR est un ensemble de commandes conçu (ainsi que de titsyr) pour couvrir les tâches de manipulation de données les plus courantes. Je ne pense pas que cette opération tombe sous elle, mais je pourrais me tromper.



3
votes

un peu maladroite mais il semble que vous devez descendre le vecteur quel que soit xxx

et votre exemple xxx

et vous pouvez remplacer avec tout ce que vous voulez xxx


1 commentaires

Merci @rawr - Ceci est une solution de travail que j'ai suscitée.



3
votes

Pour moi, il est séparément plus clair si vous utilisez une réduction de la réduction de la période de réfraction. XXX PRE>

Exemple P>

suppress(c(0,0,1,1,1,1,1), 2)
#>     [1] 0 0 1 0 0 1 0


1 commentaires

Flammes rapides !. Merci!