2016-11-30 8 views
4

Ich habe zwei Zeichenvektoren bekommen:entfernen Einträge aus String-Vektor enthalten bestimmte Zeichen in R

x = {"a", "b", "c", "kt"} 
y = {"abs", "kot", "ccf", "okt", "kk", "y"} 

Ich brauche x zu verwenden, um Einträge von y zu entfernen, so dass nur die Saiten, dass eine der nicht enthalten Die Einträge von x bleiben wie folgt:

y = {"kot", "kk", "y"} 

Der Code sollte für jede Größe der Vektoren x und y funktionieren.

Bis jetzt habe ich versucht, gsub und grepl zu verwenden, aber diese arbeiten nur mit einzelnen Saiten. Ich habe versucht, eine Schleife zu erstellen, aber das Problem scheint schwieriger als ich dachte. Und je raffinierter die Lösung ist, desto besser, aber Sie können davon ausgehen, dass in diesem Fall die Vektoren x und y bis zu 200 Einträge haben.

Antwort

4

Wir grep verwenden, um herauszufinden, was in y Werte übereinstimmen das Muster in x und schließen sie mit !%in%

y[!y %in% grep(paste0(x, collapse = "|"), y, value = T)] 

#[1] "kot" "kk" "y" 

Oder besser noch mit grepl wie es boolean Vektoren liefert

y[!grepl(paste0(x, collapse = "|"), y)] 
4

Die Die Antwort von @Ronak ist meiner Ansicht vorzuziehen, aber eine Option besteht darin, mit grepl zu verwenden, um eine Matrix von Übereinstimmungen mitzu erhalten, für jeden Eintrag in x, dann rollen Sie das mit einem anderen Anruf auf apply.

> y[!apply(sapply(x, function(q) {grepl(q, y)}), 1, function(x) {sum(as.numeric(x)) > 0})] 
[1] "kot" "kk" "y" 

Hier ist, was ich durch die Matrix der Spiele bedeuten:

> sapply(x, function(q) { grepl(q, y) }) 
     a  b  c kt 
[1,] TRUE TRUE FALSE FALSE 
[2,] FALSE FALSE FALSE FALSE 
[3,] FALSE FALSE TRUE FALSE 
[4,] FALSE FALSE FALSE TRUE 
[5,] FALSE FALSE FALSE FALSE 
[6,] FALSE FALSE FALSE FALSE 
     ^^^^ each column is a match result for each element of x 
+1

gute Option. Plus eins. Dieser wäre viel besser, wenn die Anzahl der zu vergleichenden Vektorelemente groß ist und Grep nicht richtig funktioniert. – akrun

+0

Ich stimme mit akrun überein. Dies ist sehr hilfreich, aber in diesem Fall bevorzuge ich die grepl-Lösung für meine Vektoren sind nicht so lang. – Lecromine

0

Dies sollte auch funktionieren:

y[Reduce("+", lapply(x, grepl, y, fixed=TRUE))==0] 
# [1] "kot" "kk" "y" 
Verwandte Themen