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ćmeasurement
s odobservationss for which
czasis between
czas1and
czas2from the
sampletimesdata frame. Additionally, I'd like to connect the appropriate
lokalizacja ”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