R: Teilmenge eines Datenrahmens basierend auf Bedingungen aus einem anderen Datenrahmen

Hier ist ein Problem, das ich zu lösen versuche. Angenommen, ich habe zwei Datenrahmen wie den folgenden:

observations <- data.frame(id = rep(rep(c(1,2,3,4), each=5), 5),
    time = c(rep(1:5,4), rep(6:10,4), rep(11:15,4), rep(16:20,4), rep(21:25,4)),
    measurement = rnorm(100,5,7))

sampletimes <- data.frame(location = letters[1:20], 
    id = rep(1:4,5),
    time1 = rep(c(2,7,12,17,22), each=4), 
    time2 = rep(c(4,9,14,19,24), each=4))

Sie enthalten beide eine Spalte mit dem Namenid, die die Datenrahmen verbindet. Ich möchte das habenmeasurements ausobservationss for whichZeitis betweentime1andtime2from thesampletimesdata frame. Additionally, I'd like to connect the appropriatezu jeder Messung.

Ich habe dies erfolgreich getan, indem ich meine konvertiert habesampletimes auf ein breites Format (d. h. alletime1 undtime2 Informationen in einer Zeile pro Eintrag fürid), Zusammenführen der beiden Datenrahmen durch dieid Variable, und mit bedingten Anweisungen, um nur Instanzen zu nehmen, wenn dietime liegt zwischen mindestens einem der Zeitintervalle in der Zeile und wird dann zugewiesenlocation auf die entsprechende Messung.

Ich habe jedoch rund 2 Millionen Zeilen inobservations und das dauert sehr lange. Ich suche nach einem besseren Weg, um die Daten im Langformat zu halten. Der Beispieldatensatz ist sehr einfach, aber in Wirklichkeit enthalten meine Daten eine variable Anzahl von Intervallen und Orten proid.

Für unser Beispiel würde ich mir folgenden Datenrahmen wünschen:

id time measurement letters[1:20]
1    3  10.5163892             a
2    3   5.5774119             b
3    3  10.5057060             c
4    3  14.1563179             d
1    8   2.2653761             e
2    8  -1.0905546             f
3    8  12.7434161             g
4    8  17.6129261             h
1   13  10.9234673             i
2   13   1.6974481             j
3   13  -0.3664951             k
4   13  13.8792198             l
1   18   6.5038847             m
2   18   1.2032935             n
3   18  15.0889469             o
4   18   0.8934357             p
1   23   3.6864527             q
2   23   0.2404074             r
3   23  11.6028766             s
4   23  20.7466908             t

Antworten auf die Frage(2)

Ihre Antwort auf die Frage