Sagen wir, ich habe eine data.table (kann auch data.frame sein, spielt für mich keine Rolle), die numerische Spalten a, b, c, d und e hat. Jede Zeile der Tabelle repräsentiert einen Artikel und a-e sind numerische Merkmale der Artikel.Suche nach "ähnlichen" Zeilen durch eine bedingte Verknüpfung mit sqldf
Was ich herausfinden möchte ist, welche Artikel ähnlich sind, basierend auf den Spalten a, b und c. Ich definiere "ähnlich", indem a, b und c maximal +/- 1 variieren können. Das heißt, Artikel x ist ähnlich wie Artikel y, wenn weder a, b noch c um mehr als 1 abweichen. Ihre Werte für d und e spielen keine Rolle und können erheblich abweichen.
Ich habe schon ein paar Ansätze versucht, aber nicht das gewünschte Ergebnis erhalten. Was ich erreichen möchte, ist, eine Ergebnistabelle zu erhalten, die nur solche Zeilen enthält, die mindestens einer anderen Zeile ähneln. Außerdem müssen Duplikate ausgeschlossen werden.
Insbesondere frage ich mich, ob dies mit der sqldf Bibliothek möglich ist. Meine Idee ist es, den Tisch unter den gegebenen Bedingungen mit sich selbst zu verbinden, aber ich verstehe es nicht richtig. Irgendwelche Ideen (nicht unbedingt sqldf)?
Große Antwort und sehr hilfreich, vor allem die Sqldf Beispiel. Es gibt noch eine Sache, die mich stört: Nach der Implementierung der sqldf-Lösung sind manche Lösungen mehrdeutig, weil sie eine Teilmenge einer anderen Lösung darstellen. Beispiel: a.id = 1 hat 10, 11 und 123 als b.id-Einträge. Zur gleichen Zeit hat a.id = 10 11 und 123 als b.id-Einträge. Ich möchte nicht die letzten zwei Zeilen angezeigt, da sie implizit von den ersten drei Zeilen abgedeckt werden. Gibt es eine Möglichkeit, dieses Problem direkt in der SQL-Anweisung zu lösen, oder müssen wir das später tun? Ich kann leider nur an letzteres denken. – snow8732
Nur weil Zeile 1 Zeile 10 und Zeile 11 ähnlich ist, folgt Zeile 10 nicht Zeile 11. Betrachten wir zum Beispiel die Situation 1 = (0, 0, 0), Zeile 10 = (-1, 0, 0) und Zeile 11 = (1, 0, 0). Hier sind Zeile 10 und Zeile 11 nicht ähnlich, obwohl sie beide Zeile 1 ähneln. –
Sie haben Recht. Dennoch würde Fall 1 = (0, 0, 0), Zeile 10 = (1, 0, 0) und Zeile 11 = (0,5, 0, 0) zu dem Fall führen, den ich in meinem letzten Kommentar beschrieben habe. Ich brauche einen Weg, um diese Teilmengen von Lösungen zu entfernen. – snow8732