R: subconjunto un marco de datos basado en condiciones de otro marco de datos
Aquí hay un problema que estoy tratando de resolver. Digamos, tengo dos marcos de datos como los siguientes:
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 contienen una columna llamadaid
, que enlaza los marcos de datos. Quiero tener elmeasurement
s deobservationss for which
horais between
tiempo1and
tiempo2from the
tiempos de muestradata frame. Additionally, I'd like to connect the appropriate
ubicación` a cada medida.
He hecho con éxito esto al convertir misampletimes
a un formato ancho (es decir, todas lastime1
ytime2
información en una fila por entrada paraid
), fusionando las dos tramas de datosid
variable, y el uso de sentencias condicionales para tomar solo instancias cuando eltime
se encuentra entre al menos uno de los intervalos de tiempo en la fila y luego se asignalocation
a la medida apropiada.
Sin embargo, tengo alrededor de 2 millones de filas enobservations
y hacer esto lleva mucho tiempo. Estoy buscando una mejor manera de mantener los datos en formato largo. El conjunto de datos de ejemplo es muy simple, pero en realidad, mis datos contienen números variables de intervalos y ubicaciones porid
.
Para nuestro ejemplo, el marco de datos que espero recuperar sería el siguiente:
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