en R, Utilisez gsub pour supprimer toute ponctuation sauf la période
je suis nouveau à R donc j'espère que vous pouvez m'aider.
je veux utiliser gsub pour supprimer toute ponctuation sauf pour les périodes et les signes de moins pour que je puisse garder des points décimaux et des symboles négatifs dans mes données.
Exemple
Mon bloc de données z a les données suivantes:
[,1] [,2]
[1,] "1" "6"
[2,] "2@" "7.235"
[3,] "3" "8"
[4,] "4" ""
[5,] "£5" "-10"
je veux utiliser gsub("[[:punct:]]", "", z)
pour supprimer la ponctuation.
sortie courante
> gsub("[[:punct:]]", "", z)
[,1] [,2]
[1,] "1" "6"
[2,] "2" "7235"
[3,] "3" "8"
[4,] "4" "9"
[5,] "5" "10"
je voudrais, cependant, pour garder le signe "-" et "." signer.
sortie Désirée
PSEUDO CODE:
> gsub("[[:punct:]]", "", z, except(".", "-") )
[,1] [,2]
[1,] "1" "6"
[2,] "2" "7.235"
[3,] "3" "8"
[4,] "4" "9"
[5,] "5" "-10"
des idées pour que certains caractères soient exemptés de la fonction gsub ()?
2 réponses
Vous pouvez mettre certains matchs comme ça:
sub("([.-])|[[:punct:]]", "\1", as.matrix(z))
X..1. X..2.
[1,] "1" "6"
[2,] "2" "7.235"
[3,] "3" "8"
[4,] "4" "9"
[5,] "5" "-10"
Ici, je suis maintenant la touche!--2--> et -
.
Et je suppose que , la prochaine étape est de vous contraindra résultat numérique de la matrice, ALORS là, je combine les 2 étapes comme ceci:
matrix(as.numeric(sub("([.-])|[[:punct:]]", "\1", as.matrix(z))),ncol=2)
[,1] [,2]
[1,] 1 6.000
[2,] 2 7.235
[3,] 3 8.000
[4,] 4 9.000
[5,] 5 -10.000
une Autre façon de penser, est-ce que vous voulez conserver? Vous pouvez utiliser des expressions régulières pour conserver les informations et les omettre. J'ai beaucoup de cadres de données dont j'ai besoin pour nettoyer les unités et convertir à partir de plusieurs lignes en un passage et je trouve plus facile d'utiliser quelque chose de apply
famille dans ces cas.
Recréer l'exemple:
a <- c('1', '2@', '3', '4', '£5')
b <- c('6', '7.235', '8', '', '-10')
z <- matrix(data = c(a, b), nrow = length(a), ncol=2)
alors utilisez apply
en conjonction avec gsub
.
apply(z, 2, function(x) as.numeric(gsub('[^0-9\.\-]', '', x)))
[,1] [,2]
[1,] 1 6.000
[2,] 2 7.235
[3,] 3 8.000
[4,] 4 9.000
[5,] 5 -10.000
Cela indique R pour correspond tout sauf les chiffres, les périodes et les traits d'Union/tirets. Personnellement, je le trouve beaucoup plus propre et plus facile à utiliser dans ces situations et donne le même résultat.
en outre, la documentation a une bonne explication de ces expressions régulières puissantes mais déroutantes.
https://stat.ethz.ch/R-manual/R-devel/library/base/html/regex.html
Ou ?regex