2016-08-16 1 views
0

unten schrieb ich eine Funktion, die nach bestimmten regulären Ausdrücken innerhalb eines Vektors sucht. Die Funktion sucht immer nach regulären Ausdrücken, einschließlich "Bier" oder "Wein" innerhalb eines Vektors. Jetzt möchte ich die regulären Ausdrücke, die ich suche (in meinem Fall "Bier und Wein") als zusätzliche Variablen in den Vektor einbeziehen. Wie kann ich das machen?Wie schließe ich einen regulären Ausdruck in eine Funktion in R ein?

x <- c("Beer","Wine","wine","Beer","Beef","Potato","Vacation") 
Thirsty <- function(x) { 
Beer <- grepl("Beer",x, ignore.case = TRUE) 
Beer <- as.numeric(Beer == "TRUE") 
Wine <- grepl("Wine",x, ignore.case = TRUE) 
Wine <- as.numeric(Wine == "TRUE") 
Drink <- Beer + Wine 
Drink <- as.numeric(Drink == "0") 
Drink <- abs(Drink -1) 
} 
    y <- Thirsty(x) 
    y 
+0

Sie arbeiten sollten Sie bedeuten 'grepl (" Bier. * Wein | Wein. * Bier ", x, ignore.case = TRUE)'? –

Antwort

1

Dies kann mit dem folgenden Code erfolgen:

eine Liste der logischen Vektoren, für jedes Getränk ein
x <- c("Beer","Wine","wine","Beer","Beef","Potato","Vacation") 
drinks <- c("Beer","Wine") 
Thirsty <- function(x, drinks) { 
    Reduce("|",lapply(drinks, function(p)grepl(p,x, ignore.case = TRUE))) 
} 
y <- Thirsty(x,drinks) 
y 

lapply Schleifen über die Möglichkeiten in drinks und produziert. Diese werden von Reduce zu einem einzigen Vektor kombiniert.

1

Ich würde einfach versuchen, die Match-Muster mit |

strings = c("Beer","Wine","wine","Beer","Beef","Potato","Vacation") 
thirstStrings = c("beer", "wine") 

matchPattern = paste0(thirstStrings, collapse = "|") #"beer|wine" 
grep(pattern = matchPattern, x = strings, ignore.case = T) 
# [1] 1 2 3 4 

Sie können so leicht zu verketten wickeln in einer Funktion

Thirsty = function(x, matchStrings){ 
    matchPattern = paste0(matchStrings, collapse = "|") #"beer|wine" 
    grep(pattern = matchPattern, x = x, ignore.case = T) 
} 

Thirsty(strings, thirstStrings) # [1] 1 2 3 4 
1

Dies auch

Thirsty = function(vec, ...) { 
    pattern = paste0(unlist(list(...)), collapse = "|") 
    stringr::str_detect(tolower(vec), pattern) 
} 

> Thirsty (x, "beer", "wine") 
[1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE  
+0

Sollte es nicht "tolower (vec)" in Ihrer Funktion sein? Wenn es keine spezielle Zauberei gibt, bezieht sich Ihr 'x' auf eine globale Variable und nicht auf den Eingabewert? – Choubi

+0

@Choubi, yep danke nur vergessen, es zu ändern –

Verwandte Themen