2015-12-09 6 views
4

J'ai un grand csv avec une colonne de texte qui a une largeur maximale de 200. Dans la plupart des cas, les données sont très bien. Dans certains cas, les données sont trop longues ou n'ont pas été correctement remplies, je voudrais utiliser regex pour trouver la dernière instance d'un couple numérique/caractère spécifique, puis supprimer tout ce qui suit.Remplacer les caractères après le regroupement de caractères avec rien

par exemple des données:

df <- data.frame(ID = c("1","2","3"), 
      text = c("A|explain what a is|12.2|Y|explain Y|2.36|", 
       "A|explain what a is|15.2|E|explain E|10.2|E|explain E but run out hal", 
       "D|explain what d is|0.48|Z|explain z but number 5 is present|")) 

Ma paire spécifique de caractères est un nombre suivi d'un |

Cela signifierait la ligne 1 est très bien, la ligne 2 aurait tout après '10 .2' enlevé et la ligne 3 aurait tout après 0,48 enlevé

J'ai essayé regex:

df[,2] <- sub("([^0-9]+[^|]*$)", "", df[,2]) 

très près presque travaillé mais les très rares lignes dans mes données qui ont un nombre présent dans l'explication ne jouent pas le long. Des indices? Je ne suis pas encore une excellente regexer, j'apprends les ficelles

J'ai vu this question sur le regroupement, mais je n'ai pas pu l'appliquer à mon problème.

Répondre

3

En utilisant sub, on capture un ou plusieurs caractères (.*), suivi par l'un des plusieurs numéros, suivi d'un point si elle est présente (\\.?) suivie d'un ou plusieurs numéros en tant que groupe suivi par | et le reste des personnages jusqu'à la fin de la chaîne. Dans le remplacement, le groupe de capture est spécifié (\\1).

sub('^(.*[0-9]+\\.?[0-9]+)\\|.*$', '\\1', df$text) 
+0

Je ne vais pas poster une réponse séparée avec presque le même code. Je demandais juste parce que je n'ai trouvé nulle part dans le Q la spécification pour seulement des nombres avec des nombres décimaux et votre réponse ne fonctionnera pas avec des entiers, c'est tout ... – Cath

+0

@CathG Dans la troisième rangée le numéro 5 est également enlevé. – akrun

+0

@CathG Aujourd'hui, pour la plupart du temps, je n'obtiens pas ce stackover javascript. Donc, je suis juste poster la réponse chaque fois qu'il y a une petite fenêtre où cela fonctionne. Même, je ne pouvais pas écrire les descriptions. Donc, vous avez peut-être raison, .. – akrun