J'ai un cadre de données où une colonne contient des doublons consécutifs. Je veux garder les lignes avec des doublons consécutifs (n'importe quelle longueur> 1). Je préférerais une solution dans Exemple de données: P> dplyr code> ou
data.Table code>.
# A tibble: 9 x 2
a b
<dbl> <chr>
1 10 A
2 20 A
4 40 C
5 50 C
7 70 B
8 80 B
9 90 B
14 140 E
15 150 E
7 Réponses :
Puisque vous avez aussi la balise data.table code>, j'aime à l'aide de la fonction
datable.table :: rleid code> fonction pour ces tâches, c'est-à-dire
# A tibble: 9 x 3
# Groups: grp, b [4]
a b grp
<dbl> <chr> <int>
1 10 A 1
2 20 A 1
3 40 C 3
4 50 C 3
5 70 B 5
6 80 B 5
7 90 B 5
8 140 E 10
9 150 E 10
in dans la base r, nous pouvons utiliser dplyr code> Nous pouvons utiliser
lag code> pour créer des groupes et sélectionner des groupes avec plus d'une ligne.
rle code> et
Ave code> sur
sous-ensemble code> lignes de code> Code> df code> p>
Utilisation de l'entrée Data.Table indiquée dans la note à la fin, définissez n pour être le nombre d'éléments dans chaque groupe d'éléments consécutifs, puis conservez des groupes pour lesquels il est supérieur à 1.
library(data.table) a <- seq(10,150,10) b <- c("A", "A", "B", "C", "C", "A", "B", "B", "B", "C", "A", "C", "D", "E", "E") DT <- data.table(a, b)
Vous souhaitez supprimer dupliquer sauf lors de la consécutive: le code suivant marque des valeurs en double et des valeurs consécutives, ne conserve que des lignes qui ne sont pas dupliquées ou qui font partie d'un ensemble consécutif de duplicats.
df %>% mutate(duplicate = duplicated(b), consecutive = c(NA, diff(as.integer(factor(b)))) == 0) %>% filter(!duplicate | consecutive) %>% select(-duplicate, -consecutive)
Utilisez supposer rle code> pour obtenir la longueur d'exécution.
df <- data.frame (a = a, b = b) code>, alors ce qui suit peut le faire p>
Une autre solution utilise à la fois créé le 2019-10-21 par le package Reprex (v0.3.0) sup> p> p> P> LEAD () code> et
lag () code>:
Voici une autre option (ce qui devrait être plus rapide):
# A tibble: 3 x 13 expression min median `itr/sec` mem_alloc `gc/sec` n_itr n_gc total_time result memory time gc <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl> <int> <dbl> <bch:tm> <list> <list> <list> <list> 1 mtd1(DT) 1.1s 1.1s 0.908 1.98GB 10.9 1 12 1.1s <df[,1] [2,014 x ~ <df[,3] [59 x ~ <bch:t~ <tibble [1 x ~ 2 mtd2(DT2) 2.88s 2.88s 0.348 267.12MB 0 1 0 2.88s <df[,1] [2,014 x ~ <df[,3] [23 x ~ <bch:t~ <tibble [1 x ~ 3 mtd3(DT) 639.91ms 639.91ms 1.56 505.48MB 4.69 1 3 639.91ms <df[,1] [2,014 x ~ <df[,3] [24 x ~ <bch:t~ <tibble [1 x ~
Utilisez
lag code> peut-être?