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.
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.
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.
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:
Eine einfache Funktion zum Filtern der nicht übereinstimmenden Zeilen des Vergleichsdatensatzes (mehrere Zeilen können übereinstimmen).
%Vor%Und das Ergebnis:
%Vor% 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):
Und
%Vor%Dies ergibt:
%Vor% Und lassen Sie Ihre which.min()
:
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):
Oder die max(correspondingval)
, wenn Sie bevorzugen:
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.
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%Tags und Links r data.table