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 # .. ... ... ... ... ... ...
3 Réponses :
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 .. ... ... ... ... ... ...
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.
un peu maladroite mais il semble que vous devez descendre le vecteur quel que soit et votre exemple p> et vous pouvez remplacer avec tout ce que vous voulez p>
Merci @rawr - Ceci est une solution de travail que j'ai suscitée.
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. Exemple P> suppress(c(0,0,1,1,1,1,1), 2)
#> [1] 0 0 1 0 0 1 0
Flammes rapides !. Merci!
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