2016-10-17 4 views
0

Ich habe Text-Strings zwischen zwei Vektoren in einem Datenrahmen übereinstimmen. Mehrere Werte haben genau drei Zeichen und passen als Teil eines anderen Wortes in einer anderen Zeichenfolge zusammen. Ich würde gerne den regulären Ausdruck dafür finden. Hier ein Beispiel:ändern Datenrahmen basierend auf Regex mit gsub in r

a <- c("urban", "crabtree", "rba", "rba hks","barbara", "lederbach") 
b <- c("rba", "rba", "rba", "rba", "rba", "rba") 

df <- data.frame(a, b) 

Ich mag würde ein Leerzeichen ersetzt werden (das heißt „“) für jene Werte, bei denen „RBA“ nur als einen Teil des Wortes erscheint. Die gewünschte Ausgabe ist:

b <- c("", "", "rba", "rba", "", "") 

es ist also ein bisschen wie:

grep("\\b...\\b", df$a, value = TRUE) 

Aber ich will Spalte b ändern und einfügen „“ wo es keine Übereinstimmung gibt.

Ich bin mir bewusst, dass% in% kann nach genauen Übereinstimmungen verwendet werden, aber ich hatte gehofft, für etwas mit gsub:

funb <- function(x) gsub("\\b...\\b", "", x) 
df$b <- lapply(df$b, funb) 

aber ich habe nicht viel Glück gehabt. Offensichtlich ist etwas nicht in Ordnung, kann mir jemand helfen, das gewünschte Ergebnis zu bekommen? Jeder Rat oder Vorschläge würde sehr geschätzt werden. Vielen Dank.

+0

Wofür ist die Spalte 'b'? Wäre nicht etwas wie 'a [! Grepl ("\\ brba \\ b", a)] <- "" funktionieren? –

+0

@DavidArenburg Die Spalte b ist die Spalte der Übereinstimmungen. aus einem größeren Datenrahmen ist "rba" die Zeichenfolge, die am besten mit der in Spalte a übereinstimmt. Also möchte ich Spalte b behalten, aber ich möchte, dass es wie der "letzte" Vektor oben aussieht. – jvalenti

+1

Würde das funktionieren 'library (stringi); a [! stri_detect_regex (a, paste0 ("\\ b", b, "\\ b"))] <- "" '? –

Antwort

0

Basierend auf @ David Arenburg Kommentar über die allgemeine Lösung für dieses Problem ist:

b[!stri_detect_regex(a, paste0("\\b", b, "\\b"))] <- "" 

, welche Elemente in der Spalte b bearbeitet, wie gewünscht.