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"