0
votes

Garder des doublons consécutifs

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 dplyr code> ou data.Table code>.

Exemple de données: P>

# 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 


1 commentaires

Utilisez lag peut-être?


7 Réponses :


0
votes

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


0 commentaires

1
votes

in dplyr Nous pouvons utiliser lag pour créer des groupes et sélectionner des groupes avec plus d'une ligne. xxx


dans la base r, nous pouvons utiliser rle et Ave sur sous-ensemble lignes de Code> df xxx


0 commentaires

2
votes

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)


0 commentaires

0
votes

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)


0 commentaires

0
votes

Utilisez rle pour obtenir la longueur d'exécution.

supposer df <- data.frame (a = a, b = b) , alors ce qui suit peut le faire xxx


0 commentaires

0
votes

Une autre solution utilise à la fois LEAD () et lag () : xxx

créé le 2019-10-21 par le package Reprex (v0.3.0)


0 commentaires

0
votes

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 ~


0 commentaires