web-dev-qa-db-fra.com

dans R, utilisez gsub pour supprimer toute ponctuation sauf le point

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 ()?

11

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
11
agstudy

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

1
hubbs5