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.