Je suis nouveau chez R, j'espère que vous pourrez m'aider.
Je souhaite utiliser gsub pour supprimer toute ponctuation, à l'exception des points et des signes moins, afin de pouvoir conserver des points décimaux et des symboles négatifs dans mes données.
Exemple
Mon bloc de données z contient les données suivantes:
[,1] [,2]
[1,] "1" "6"
[2,] "2@" "7.235"
[3,] "3" "8"
[4,] "4" "$9"
[5,] "£5" "-10"
Je souhaite utiliser gsub("[[:punct:]]", "", z)
pour supprimer la ponctuation.
Sortie courant
> gsub("[[:punct:]]", "", z)
[,1] [,2]
[1,] "1" "6"
[2,] "2" "7235"
[3,] "3" "8"
[4,] "4" "9"
[5,] "5" "10"
Je voudrais cependant garder le signe "-" et le "." signe.
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 sur la façon dont je peux rendre certains caractères exemptés de la fonction gsub ()?
Vous pouvez remettre quelques matchs comme ceci:
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 garde les .
et -
.
Et je suppose que la prochaine étape consiste à vous contraindre à une matrice numérique. SO Je combine les 2 étapes suivantes:
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 de savoir ce que vous voulez garder. Vous pouvez utiliser des expressions régulières pour conserver des informations et les omettre. Il me faut beaucoup de trames de données pour nettoyer les unités et les convertir à partir de plusieurs lignes en une seule passe, et il est plus facile d'utiliser un élément de la famille apply
dans ces cas.
Recréer l'exemple:
a <- c('1', '2@', '3', '4', '£5')
b <- c('6', '7.235', '8', '$9', '-10')
z <- matrix(data = c(a, b), nrow = length(a), ncol=2)
Ensuite, utilisez apply
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
Ceci indique à R de faire correspondre tout, à l'exception des chiffres, des points et des traits d'union/tirets. Personnellement, je le trouve beaucoup plus propre et facile à utiliser dans ces situations et donne le même résultat.
La documentation fournit également 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