2017-11-17 5 views
2

ich bestimmte Wörter aus einem Datenrahmen zu entfernen bin versucht:Wörter aus String entfernen

name age words 
James 34 hello, my name is James. 
John 30 hello, my name is John. Here is my favourite website https://stackoverflow.com 
Jim 27 Hi! I'm another persoon whose name begins with a J! Here is something that should be filtered out: <filter> 

df<-structure(list(name = structure(c(1L, 3L, 2L), .Label = c("James", 
"Jim", "John"), class = "factor"), age = c(34L, 30L, 27L), message = structure(1:3, .Label = c("hello, my name is James. ", 
"hello, my name is John. Here is my favourite website https://stackoverflow.com", 
"Hi! I'm another persoon whose name begins with a J! Here is something that should be filtered out: <filter>" 
), class = "factor")), .Names = c("name", "age", "message"), class = "data.frame", row.names = c(NA, 
-3L)) 

Ich versuche, alle Wörter zu entfernen Übereinstimmungen mit dem http oder filter enthält.

Ich würde gerne über jede Zeile iterieren, teilen Sie die Zeichenfolge auf Leerraum und fragen Sie dann, ob das Wort entweder http oder <filter> (oder andere Wörter) enthält. Wenn ja, dann möchte ich das Wort durch ein Leerzeichen ersetzen.

Es gibt ein loadofquestions über das Entfernen Worte, die exatly ein anderes Wort oder eine Liste von Wörtern entsprechen, aber ich kann auf das Entfernen Worte nicht viel finden, die einige Kriterien entsprechen (z http oder www.).

Ich habe versucht:

gsub, !grepl und tm_map Ansätze (zB this), aber ich kann nicht jeden von ihnen erhalten, meine erwarteten Ausgabe von produzieren:

name age words 
James 34 hello, my name is James. 
John 30 hello, my name is John. Here is my favourite website 
Jim 27 Hi! I'm another persoon whose name begins with a J! Here is something that should be filtered out: 
+0

Das Wort "gefiltert" in der letzten Zeile paßt 'filter' und entfernt werden, basierend auf Ihren Erklärungen werden soll. Außer du meinst "". – AntoniosK

+1

@AntoniosK - du hast Recht. Ich habe die Frage aktualisiert – fugu

+0

Cool. Die Antwort unten wird dir definitiv helfen .... – AntoniosK

Antwort

2

zu einem nicht-Leer Chunks cont entfernen aining entweder http oder filter (oder mit anderen Worten) als ganze Wörter Sie gsub mit folgendem PCRE regex (add perl=TRUE Argument) verwenden:

(?:\s+|^)\S*(?<!\w)(?:https?|<filter>)(?!\w)\S* 

Siehe regex demo

Einzelheiten

  • (?:\s+|^) - 1+ wjhitespaces oder Beginn der Zeichenfolge
  • \S* - 0+ Nicht-Leerzeichen Zeichen so viele wie möglich
  • (?<!\w) - kein Wort char sofort links von der aktuellen Position erlaubt
  • (?:https?|<filter>)-http, https oder <filter>
  • (?!\w) - kein Wort char unmittelbar rechts von der aktuellen Position erlaubt (nach den Worten in der Wechsel-Gruppe)
  • \S* - 0+ nicht-Leerzeichen Zeichen so viele wie möglich.

Sehen Sie ein online R demo:

df<-structure(list(name = structure(c(1L, 3L, 2L), .Label = c("James", 
"Jim", "John"), class = "factor"), age = c(34L, 30L, 27L), message = structure(1:3, .Label = c("hello, my name is James. ", 
"hello, my name is John. Here is my favourite website https://stackoverflow.com", 
"Hi! I'm another persoon whose name begins with a J! Here is something that should be filtered out: <filter>" 
), class = "factor")), .Names = c("name", "age", "message"), class = "data.frame", row.names = c(NA, 
-3L)) 
df$message <- gsub("(?:\\s+|^)\\S*(?<!\\w)(?:https?|<filter>)(?!\\w)\\S*", "", df$message, perl=TRUE) 
df$message 

Ergebnis:

[1] "hello, my name is James. "                   
[2] "hello, my name is John. Here is my favourite website"            
[3] "Hi! I'm another persoon whose name begins with a J! Here is something that should be filtered out:" 
2

Wir verwenden gsub

gsub("\\s(https:\\S+|<filter>)", "", df$message) 
Verwandte Themen