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 habenmeasurement
s ausobservationss for which
Zeitis between
time1and
time2from the
sampletimesdata frame. Additionally, I'd like to connect the appropriate
zu 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