2 votes

Supprimer une partie de la chaîne basée sur une expression régulière en r

Dites que j'ai un vecteur de chaînes de caractères comme suit:

vector<-c("salut, comment ça va?", 
           "quelle heure est-il?", 
           "le ciel est bleu", 
           "salut, comment ça va aujourd'hui? Tu sembles fatigué.", 
           "promener le chien", 
           "l'herbe est verte", 
           "le ciel est bleu pendant la journée")

vector
[1] "salut, comment ça va?"                      
[2] "quelle heure est-il?"                            
[3] "le ciel est bleu"                             
[4] "salut, comment ça va aujourd'hui? Tu sembles fatigué."
[5] "promener le chien"                                
[6] "l'herbe est verte"                          
[7] "le ciel est bleu pendant la journée" 

Comment puis-je identifier toutes les entrées dont les 4 premiers mots correspondent et ensuite ne garder que la chaîne correspondante la plus longue? Je cherche à ce que mon résultat ressemble au vecteur suivant:

vector                    
[1] "quelle heure est-il?"                                                        
[2] "salut, comment ça va aujourd'hui? Tu sembles fatigué."
[3] "promener le chien"                                
[4] "l'herbe est verte"                          
[5] "le ciel est bleu pendant la journée"                          

Idéalement, je voudrais une solution utilisant stringr pour pouvoir l'insérer dans un pipe.

MISE À JOUR: Vérification de la robustesse avec des valeurs différentes:

La solution de @Wimpel est brillante mais comme le souligne @Wimpel, elle ne fonctionne pas tout à fait dans tous les scénarios. Voyez par exemple:

vector<-c("salut, comment ça va?", 
          "quelle heure est-il?", 
          "le ciel est bleu", 
          "salut, comment ça va aujourd'hui? Tu sembles fatigué.", 
          "promener le chien", 
          "l'herbe est verte", 
          "le ciel est bleu pendant la journée", 
          "12/7/2018", 
          "8/12/2018", 
          "9/9/2016 ")

df <- data.frame( text = vector, stringsAsFactors = FALSE ) 
df$group_id <- df %>% group_indices( stringr::word( text, start = 1, end = 4) ) 
df %>%
    mutate( length = str_count( text, " ") + 1,
            row_id = row_number() ) %>%
    group_by( group_id ) %>%
    arrange( -length ) %>%
    slice(1) %>%
    ungroup() %>%
    arrange( row_id ) %>%
    select( text )

1 quelle heure est-il?                            
2 salut, comment ça va aujourd'hui? Tu sembles fatigué.
3 promener le chien                                
4 l'herbe est verte                          
5 le ciel est bleu pendant la journée  

Dans l'exemple ci-dessus, les dates sont également supprimées même si elles ne correspondent pas.

5voto

Wimpel Points 3380

utiliser des données d'échantillon mises à jour

vec <- c("salut, comment ça va?", 
          "quelle heure est-il?", 
          "le ciel est bleu", 
          "salut, comment ça va aujourd'hui? Tu as l'air fatigué.", 
          "promenez le chien", 
          "l'herbe est verte", 
          "le ciel est bleu pendant la journée", 
          "7/12/2018", 
          "12/8/2018", 
          "9/9/2016")

code

library( tidyverse )

df <- data.frame( text = vec, stringsAsFactors = FALSE ) 
#greate group_indices
df$group_id <- df %>% group_indices( stringr::word( text, start = 1, end = 4) ) 

df %>%
  #créer quelques variables d'aide
  mutate( length = str_count( text, " ") + 1,
          row_id = row_number() ) %>%
  #maintenant regrouper par id
  group_by( group_id ) %>%
  #organiser par groupe sur la longueur (descendante)
  arrange( -length ) %>%
  #garder uniquement la première ligne (de chaque groupe), ainsi que toutes les chaînes de moins de 4 mots
  filter( (row_number() == 1L & length >= 4) | length < 4 ) %>%
  ungroup() %>%
  #rétablir l'ordre d'origine
  arrange( row_id ) %>%
  select( text )

output

# # A tibble: 8 x 1
# text                                        
#                                          
# 1 quelle heure est-il?                       
# 2 salut, comment ça va aujourd'hui? Tu as l'air fatigué.
# 3 promenez le chien                           
# 4 l'herbe est verte                           
# 5 le ciel est bleu pendant la journée         
# 6 7/12/2018                                   
# 7 12/8/2018                                   
# 8 9/9/2016

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X