So identifizieren Sie Überlappungen in mehreren Spalten

8

Ich habe ein Dataset ( mydata ), das mehrere Spalten enthält, die in Bereiche passen könnten, die in einem anderen Dataset gespeichert sind ( mycomparison ).

Ich möchte mycomparison mit mydata verbinden, wobei die mydata Werte innerhalb der Bereiche in mycomparison liegen.

MWE

%Vor%

Gewünschte Ausgabe

%Vor%

Aktuelle Lösung

Dies fühlt sich sehr klobig an und beinhaltet das Verbinden der Daten (indem optiRum::CJ.dt verwendet wird), macht eine große logische Überprüfung und fügt dann die Daten wieder zusammen.

%Vor%

Suche nach einer besseren Lösung - AKTUALISIERT

Ich kenne foverlaps , aber es funktioniert in einem einzigen Intervall, nicht in vielen Bereichen wie in diesem Fall.

Ich hoffe auf eine weniger klobige und elegantere Lösung.

    
Steph Locke 16.02.2015, 11:30
quelle

3 Antworten

0

Nette Frage! Im Folgenden finden Sie meine schnelle Lösung, aber es ist auch immer noch ein wenig zu cluncky für meinen Geschmack.

Die generierte mydata Menge:

%Vor%

Eine einfache Funktion zum Filtern der nicht übereinstimmenden Zeilen des Vergleichsdatensatzes (mehrere Zeilen können übereinstimmen).

%Vor%

Und das Ergebnis:

%Vor%     
Bart 17.03.2015 15:00
quelle
0

Ich verstehe Ihre gewünschte Ausgabe nicht genau, da mehrere IDs mit der mycomparison data.table übereinstimmen. Verwenden Sie Ihre Daten (auf zwei Dezimalstellen gerundet):

%Vor%

Und

%Vor%

Dies ergibt:

%Vor%

Und lassen Sie Ihre which.min() :

%Vor%

Wenn Sie die data.table-Gruppierungsfunktion verwenden, können Sie die min(correspondingval) für jede id auswählen (ich lasse die nicht übereinstimmenden Daten für den Moment weg):

%Vor%

Oder die max(correspondingval) , wenn Sie bevorzugen:

%Vor%

Wenn Sie, wie in Ihrer gewünschten Ausgabe angegeben, die erste Zeile mit der Mindestanzahl correspondingval und alles andere mit NA verwenden möchten, gibt es hierfür einfachere Möglichkeiten. Wenn Sie wissen möchten, wo jeder id einem Bereich entspricht - wie ich in meiner Ausgabe gezeigt habe - dann ist eine sauberere, elegantere Lösung anders.

Lass es mich wissen.

    
Daniel Wisehart 24.08.2016 18:51
quelle
0

Es gibt einen einfachen Ansatz, der die Funktion crossing von tidyr verwendet, zusammen mit der sehr nützlichen Funktion zwischen von dplyr. Natürlich funktioniert das sicher, solange mindestens eine der Tabellen relativ klein ist, andernfalls kann crossing ein Speicher-Hog sein.

%Vor%     
GGAnderson 11.03.2018 11:36
quelle

Tags und Links