2016-07-13 4 views
5

Welcher ist der kürzeste Weg, um grep zu verwenden, um mehrere Muster in beliebiger Reihenfolge an einer beliebigen Stelle in einer Zeichenfolge zu finden? Vorzugsweise wird die Base R in einer kurzen Linie verwendet.Ordnen Sie mehrere Muster in beliebiger Reihenfolge an einer beliebigen Stelle in einer Zeichenfolge zu.

Hier ist ein Beispiel:

Ich möchte alle Elemente finden, die alle dieser beiden Elemente in meinem matches Vektor enthalten, in beliebiger Reihenfolge, in jedem Ort zusammen in den Elementen my_vector, mit irgendwelchen Zeichen zwischen ihnen innerhalb des Elements.

matches <- c("fe", "ve") 

#    1 2 3  4  5  6  7  8  9 
my_vector <- c("fv", "v", "f", "f_v_e", "fe_ve", "feve", "vefe", "fve" , "a") 

# want 5, 6, 7 

Ich kann dies tun:

grep(paste0("(?=.*", paste0(matches, sep = ""), ")", collapse = ""), 
    my_vector, 
    perl = TRUE) 

[1] 5 6 7 

Aber ist es eine knappe Methode? In meinem Beispiel habe ich zwei Elemente zu vergleichen, aber mein aktuelles Problem hat mehrere.

+0

@ user2100721 ​​- wo ist 'fe' in 8? – thelatemail

+1

@ user2100721 ​​- * Ich möchte alle Elemente finden, die ** alle ** dieser beiden Elemente enthalten * – thelatemail

+1

@thelatemail: Ooh ... sorry. Das habe ich vermisst. Vielen Dank. – user2100721

Antwort

4

Eine Option die regex/paste würde zu vermeiden sein

which(grepl(matches[1], my_vector) & grepl(matches[2],my_vector)) 
#[1] 5 6 7 

Um es mehr dynamische

which(Reduce(`&`, lapply(matches, grepl, my_vector))) 
#[1] 5 6 7 

Oder wie @Jota erwähnt grepintersect

verwendet werden können
Reduce(intersect, lapply(matches, grep, my_vector)) 

Wenn es sind viele Elemente in , die paste Methode funktioniert möglicherweise nicht ...

+1

Fantastisch, danke! Das ist viel weniger tippen – Ben

+5

ähnlich: 'Reduce (schneiden, lapply (Übereinstimmungen, grep, my_vector))' – Jota

+1

Um mit Pfeifen zu verwenden: 'my_df%>% Filter (Reduzieren (' & ', lapply (Übereinstimmungen, grepl, my_column))) 'mit Backticks um die & (nicht sicher, wie man das in einem Kommentar bekommt!) – Ben

Verwandte Themen