2016-10-13 46 views
0

Ich möchte derzeit einen Datenrahmen in Teilmengen für Training/Test teilen. Im Datenrahmen gibt es Spalten, die verschiedene Elemente enthalten, und einige enthalten Unterelemente wie (Aisle01, Aisle02 usw.). Ich werde durch das Ausfiltern einer Teilzeichenfolge in mehreren Spalten gestolpert.Filter & Subset, wenn ein String bestimmte Zeichen enthält (in R)

Daten Beispiel:

Column1 Column2 Column3 

Wall01 Wall04 45.6 
Wall04 Aisle02 65.7 
Aisle06 Wall01 45.0 
Aisle01 Wall01 33.3 
Wall01 Wall04 21.1 

Wenn mein Datenrahmen (x) zwei Spalten enthält, die in ihnen mehrere Version von „Aisle“ enthalten, möchte ich von beiden Spalten alles, um herauszufiltern, die „Aisle“ enthält. Fragst du dich, ob die Linie unten etwas auf der richtigen Spur ist?

Filter (x, column1 & column2 == grep (x $ column1 & x $ column2 "Aisle"))

Wunschergebnis:

Column1 Column2 Column3 

Wall04 Aisle02 65.7 
Aisle06 Wall01 45.0 
Aisle01 Wall01 33.3 

Vielen Dank im Voraus.

+0

Bitte geben Sie ein reproduzierbares Beispiel an. Sie können 'dput' in Ihrem Datensatz verwenden (oder nur die ersten paar Zeilen davon), damit wir sehen können, worüber Sie sprechen, und dann am Ende zeigen, was Ihr gewünschtes Ergebnis in diesem Datensatz wäre. – Barker

Antwort

0

Die einfachste Lösung, die ich sehen kann, würde dies:

x <- x[grepl("Aisle", x[["column1"]]) | grepl("Aisle", x[["column2"]]), ] 

Mit grepl statt grep eine logische erzeugt, so dass Sie die | Betrieb verwenden können, um Zeilen auszuwählen. Außerdem wollte ich nur schnell ein paar Stellen in Ihrem Code durchgehen, die Ihnen möglicherweise Probleme bereiten.

  1. Die x$column1 & x$column2 am Anfang Ihrer grep Aussage bedeutet, dass die Funktion versucht, den & Betrieb paarweise auf jedem der Einträge in column1 und column2 zu laufen. Da dies Zeichen und keine logischen sind, wird dies einige seltsame Ergebnisse erzeugen.

  2. In grep die pattern Sie versuchen, kommt vor dem String passen Sie es versuchen zu passen, so sollte es um grep("Aisle", columnValue) nicht anders sein. Wenn Sie ?functionName ausführen, erhalten Sie Informationen über die Funktion, so dass Sie nicht versuchen müssen, das aus dem Speicher herauszufinden.

  3. filter ist eine Funktion für Zeitreihen (ts) Objekte, keine Datenrahmen. Ich bin überrascht, dass Sie keinen Fehler bekommen haben, indem Sie es auf diese Weise benutzt haben.

Viel Glück. Kommentar, wenn Sie etwas geklärt haben möchten.

+0

Das ist absolut was ich suche. Wenn möglich, könnte ich eine Spalte im ursprünglichen Datenrahmen erstellen, die eine logische Ausgabe wie (1 oder 0) zeigt, wenn Spalte1 und/oder Spalte2 diese Zeichenfolge enthält? – AVI

+0

'x [[" isAisle "]] <- grepl (" Gang ", x [[" Spalte1 "]]) | grepl ("Aisle", x [["column2"]]) ' – Barker

+0

Das ist hilfreich, aber alle Werte in" isAisle "sind für mich FALSCH, während ich hoffe, dass der" Aisle "mit Zeilen TRUE während jeder Zeile enthält nicht "Aisle" false. Vielen Dank noch einmal! – AVI

Verwandte Themen