2017-05-22 3 views
1

Ich habe einen unordentlichen gregexpr Anruf, der wie unten schaut (sie paßt auf jedem einzelnen oder Mutiple Zahlen, die vor einem der folgenden Einheiten sind in dem Einheitsvektor unten aufgeführt):Funktion/Schleife innerhalb gregexpr R

sub_matches <- as.character(regmatches(tolower(data$Dose.taken), 
     gregexpr("[0-9]+[0-9]g|+[0-9]g|[0-9]+[0-9]mg|+[0-9]mg|+[0-9]gm 
      |[0-9]+[0-9]gm |[0-9]+[0-9]grm|+[0-9]grm 
       |[0-9]+[0-9]ml|+[0-9]ml|[0-9]+[0-9]iu|+[0-9]iu 
        |[0-9]+[0-9]mls|+[0-9]mls|[0-9]+[0-9]gl|+[0-9]gl 
         |[0-9]+[0-9]l|+[0-9]l|[0-9]+[0-9]sheet|+[0-9]sheet 
          |[0-9]+[0-9]mcg|+[0-9]mcg", 
           tolower(data$Dose.taken)))) 

Ich möchte dies in einer Funktion oder Schleife so wickeln, dass es durch den folgenden Einheitsvektor durchläuft. Das Folgende funktioniert jedoch nicht in seiner derzeitigen Form. Wie kann ich das aufräumen?

unit <- c("g","mg","gm","grm","ml","mls","l","mcg","iu","sheet") 

i<-1 

for(i in 1:length(unit)){ 

sub_matches <- as.character(regmatches(tolower(data$Dose.taken), 
     gregexpr("[0-9]+[0-9]paste(unit[i])|+[0-9]paste(unit[i])",tolower(data$Dose.taken)))) 


} 
+0

Können Sie einige Beispieldaten für Ihre 'Dose.taken' Spalte angeben? Ich vermute, du könntest die gleichen Matches mit einem viel kleineren Regex durchführen. – Marius

Antwort

1

Wenn Sie ein Zeichen Vektor speichern die Einheiten nutzen wollen, würde ich mit paste0 oder sprintf spielen.

regex <- sprintf('\\d+(%s)', paste(unit, collapse='|')) 

sub_matches <- 
    regmatches(data$Dose.taken, 
    gregexpr(regex, ignore.case=TRUE, data$Dose.taken)) 

Andernfalls vereinfachen Ihren regulären Ausdruck (Basis von Ihrer Aussage über):

sub_matches <- 
    regmatches(data$Dose.taken, 
    gregexpr('\\d+(gm?|grm|iu|l|mcg|mg|mls?|sheet)', ignore.case=TRUE, data$Dose.taken)) 
1

mit Hwnd Zustimmen! Meine Twopence:

  1. Ihre Regex [0-9] + [0-9] kann nur mit [0-9] + ersetzt werden.
  2. Vermeiden Sie Schleifen: paste(paste("[0-9]+",unit,sep=""),collapse="|") die dann mit den verwendet werden kann "[0-9]+g|[0-9]+mg|[0-9]+gm|[0-9]+grm|[0-9]+ml|[0-9]+mls|[0-9]+l|[0-9]+mcg|[0-9]+iu|[0-9]+sheet" .. und das gibt (regmatches, gregexpr)

Haftungsausschluss: Ich würde dies als Kommentar zu Hwnd Antwort, wenn ich das gehabt haben platziert Ruf, dies zu tun.

+0

Danke - das funktioniert sehr gut. – sharkey32

Verwandte Themen