R: subconjunto de um quadro de dados com base nas condições de outro quadro de dados
Aqui está um problema que estou tentando resolver. Diga, eu tenho dois quadros de dados como o seguinte:
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))
Ambos contêm uma coluna chamadaid
, que liga os quadros de dados. Eu quero ter omeasurement
s deobservationss for which
Tempois between
time1and
time2from the
sampletimesdata frame. Additionally, I'd like to connect the appropriate
localização »para cada medição.
Eu consegui fazer isso convertendo meusampletimes
para um formato amplo (ou seja, todos ostime1
etime2
informações em uma linha por entrada paraid
), fundindo os dois quadros de dados peloid
variável, e usando declarações condicionais para tomar apenas instâncias quando otime
fica entre pelo menos um dos intervalos de tempo na linha e, em seguida, atribuilocation
para a medição apropriada.
No entanto, tenho cerca de 2 milhões de linhas emobservations
e fazer isso leva muito tempo. Estou procurando uma maneira melhor de manter os dados em formato longo. O conjunto de dados de exemplo é muito simples, mas, na realidade, meus dados contêm números variáveis de intervalos e locais porid
.
Para o nosso exemplo, o quadro de dados que espero recuperar é o seguinte:
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