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

10
demandé sur Crayon Constantinople 2014-02-03 21:39:28

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
11
répondu agstudy 2014-02-03 18:05:08

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

1
répondu hubbs5 2016-09-29 08:11:23