R: podzestaw ramki danych na podstawie warunków z innej ramki danych

Oto problem, który próbuję rozwiązać. Powiedzmy, że mam dwie ramki danych w następujący sposób:

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))

Oba zawierają kolumnę o nazwieid, który łączy ramki danych. Chcę miećmeasurements odobservationss for whichczasis betweenczas1andczas2from thesampletimesdata frame. Additionally, I'd like to connect the appropriatelokalizacja ”do każdego pomiaru.

Udało mi się to zrobić, konwertując mojesampletimes do szerokiego formatu (tj. wszystkietime1 itime2 informacje w jednym wierszu na wpis dlaid), łączenie dwóch ramek danych przezid zmienna i używanie instrukcji warunkowych do podejmowania tylko przypadków, gdytime mieści się między co najmniej jednym z przedziałów czasowych w wierszu, a następnie przypisywanielocation do odpowiedniego pomiaru.

Mam jednak około 2 miliony wierszyobservations a zrobienie tego zajmuje naprawdę dużo czasu. Szukam lepszego sposobu, w jaki mogę przechowywać dane w długim formacie. Przykładowy zestaw danych jest bardzo prosty, ale w rzeczywistości moje dane zawierają zmienną liczbę przedziałów i lokalizacji naid.

W naszym przykładzie ramka danych, którą chciałbym odzyskać, byłaby następująca:

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

questionAnswers(2)

yourAnswerToTheQuestion