Dans le texte de la colonne comment il est possible de supprimer toutes les remarques de ponctuation mais de ne conserver que le?
data.frame(id = c(1), text = c("keep??it"))
production attendue
data.frame(id = c(1), text = c("keep<>-??it--!@#"))
4 Réponses :
Une solution plus générale serait d'utiliser des commandes gsub
imbriquées qui convertissent ?
à une chaîne inhabituelle particulière (comme "foobar"), se débarrasse de toute ponctuation, puis écrit "foobar" à ?
:
gsub("foobar", "?", gsub("[[:punct:]]", "", gsub("\\?", "foobar", df$text))) #> [1] "keep??it"
En utilisant gsub
vous pouvez faire:
gsub("(\\?+)|[[:punct:]]","\\1",df$text) [1] "keep??it"
gsub('[[:punct:] ]+',' ',data)
supprime toute ponctuation qui n'est pas ce que vous voulez.
Mais c'est:
library(stringr) sapply(df, function(x) str_replace_all(x, "<|>|-|!|@|#","")) id text [1,] "1" "a" [2,] "2" "keep??it"
Mieux IMO que les autres réponses car pas besoin d'imbrication, et vous permet de définir les caractères à sub
.
Voici une autre solution utilisant l'anticipation négative:
df <- data.frame(id = c(1), text = c("keep<>-??it--!@#"))
La recherche négative affirme que le caractère suivant n'est pas un ?
puis correspond à toute ponctuation.
Les données:
gsub("(?!\\?)[[:punct:]]", "", df$text, perl = T) [1] "keep??it"