R: подмножество фрейма данных на основе условий из другого фрейма данных
Вот проблема, которую я пытаюсь решить. Скажем, у меня есть два фрейма данных, как показано ниже:
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))
Они оба содержат столбец с именемid
, который связывает фреймы данных. Я хочу иметьmeasurement
с изobservationss for which
времяis between
time1and
time2from the
sampletimesdata frame. Additionally, I'd like to connect the appropriate
местоположение` для каждого измерения.
Я успешно сделал это путем преобразования моегоsampletimes
в широком формате (т.е. всеtime1
а такжеtime2
информация в одной строке для каждой записиid
), объединяя два фрейма данныхid
переменной, и используя условные операторы, чтобы принимать только те случаи, когдаtime
попадает между по крайней мере один из временных интервалов в строке, а затем назначаяlocation
к соответствующему измерению.
Тем не менее, у меня есть около 2 миллионов строк вobservations
и это занимает очень много времени. Я ищу лучший способ хранить данные в длинном формате. Пример набора данных очень прост, но в действительности мои данные содержат переменное количество интервалов и местоположений наid
.
Для нашего примера фрейм данных, который я хотел бы получить обратно, будет следующим:
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