Объединить кадры данных по временному интервалу в R

У меня есть два фрейма данных. Один - это фрейм данных отслеживания взгляда с предметом, условием, отметкой времени, положением по оси x и положением по оси y. В нем более 400 000 строк. Вот набор данных игрушки для примера:

   subid condition time xpos ypos
1      1         1 1.40  195  140
2      1         1 2.50  138  147
3      1         1 3.40  140  162
4      1         1 4.10  188  150
5      1         2 1.10  131  194
6      1         2 2.10  149  111

eyedata <- data.frame(subid = rep(1:2, each = 8),
           condition = rep(rep(1:2, each = 4),2),
           time = c(1.4, 2.5, 3.4, 4.1, 
                    1.1, 2.1, 3.23, 4.44, 
                    1.33, 2.3, 3.11, 4.1,
                    .49, 1.99, 3.01, 4.2),
           xpos = round(runif(n = 16, min = 100, max = 200)),
           ypos = round(runif(n = 16, min = 100, max = 200)))

Затем у меня есть фрейм данных с темой, условием, номером испытания, а также временем начала и окончания испытания. Выглядит это так:

   subid condition trial begin end
1      1         1     1  1.40 2.4
2      1         1     2  2.50 3.2
3      1         1     2  3.21 4.5
4      1         2     1  1.10 1.6
5      1         2     2  2.10 3.3
6      1         2     2  3.40 4.1
7      2         1     1  0.50 1.1
8      2         1     1  1.44 2.9
9      2         1     2  2.97 3.3
10     2         2     1  0.35 1.9
11     2         2     1  2.12 4.5
12     2         2     2  3.20 6.3

trials <- data.frame(subid = rep(1:2, each = 6),
                     condition = rep(rep(1:2, each = 3),2),
                     trial= c(rep(c(1,rep(2,2)),2),rep(c(rep(1,2),2),2)),
                     begin = c(1.4, 2.5, 3.21, 
                               1.10, 2.10, 3.4, .50,
                               1.44,2.97,.35,2.12,3.20),
                     end = c(2.4,3.2,4.5,1.6,
                             3.3,4.1,1.1,2.9,
                             3.3,1.9,4.5,6.3))

Количество испытаний в условии является переменным, и я хочу добавить столбец в свой фрейм данных для отслеживания взгляда, который указывает правильное испытание в зависимости от того, попадает ли временная метка в интервал времени. Временные интервалы не перекрываются, но между испытаниями будет много строк для данных отслеживания взгляда. В конце концов, мне нужен такой фрейм данных:

subid condition trial time xpos ypos
    1      1        1 1.40  198  106
    1      1        2 2.50  166  139
    1      1        2 3.40  162  120
    1      1        2 4.10  113  164
    1      2        1 1.10  162  120
    1      2        2 2.10  162  120

Я видел data.table скользящие соединения, но предпочел бы решение с dplyr или fuzzyjoin. Заранее спасибо.


person Spencer Castro    schedule 11.08.2017    source источник
comment
Это просто пример структуры результата или это полный ожидаемый результат на основе данных?   -  person Andrew Lavers    schedule 11.08.2017
comment
Отображаемый eyedata не соответствует данным фрейма данных.   -  person Andrew Lavers    schedule 11.08.2017
comment
Как @ epi99 указал на ваш вывод и объяснение того, что ваш выходной фрейм данных не соответствует. Если вы можете точно сказать, что вам нужно, что вы уже пробовали, мы можем помочь.   -  person i.n.n.m    schedule 11.08.2017
comment
Извините, это всего лишь пример того, как может выглядеть результат. Я не уверен, как желаемый результат не совпадает с примером eyedata, за исключением того факта, что вначале будет много, возможно, сотни строк с пробной меткой none, а затем много строк с меткой 1 и 2 для каждого состояние.   -  person Spencer Castro    schedule 11.08.2017
comment
Хорошо, думаю, я исправил любые неточности. Я бы хотел проверить, находится ли time в отслеживании глаз между begin и end для заданных subid и condition, и если да, то какой номер для trial связан с этим временным окном? Добавьте этот номер из trial в отдельный столбец в кадре данных отслеживания взгляда.   -  person Spencer Castro    schedule 11.08.2017


Ответы (1)


Вот что я пробовал, но я не могу понять расхождения, так что это, вероятно, неполный ответ. Строки 12,13 этого результата могут перекрывать друг друга по времени. Кроме того, при использовании функций случайной генерации, таких как runif, пожалуйста, set.seed - здесь xpos и ypos не влияют на результат, поэтому не проблема.

eyedata  %>%
  left_join(trials, by = c("subid", "condition")) %>%
  filter( (time >= begin & time <= end)) 

#    subid condition time xpos ypos trial begin end
# 1      1         1 1.40  143  101     1  1.40 2.4
# 2      1         1 2.50  152  173     2  2.50 3.2
# 3      1         1 3.40  185  172     2  3.21 4.5
# 4      1         1 4.10  106  119     2  3.21 4.5
# 5      1         2 1.10  155  165     1  1.10 1.6
# 6      1         2 2.10  169  154     2  2.10 3.3
# 7      1         2 3.23  166  134     2  2.10 3.3
# 8      2         1 2.30  197  171     1  1.44 2.9
# 9      2         1 3.11  140  135     2  2.97 3.3
# 10     2         2 0.49  176  139     1  0.35 1.9
# 11     2         2 3.01  187  180     1  2.12 4.5
# 12     2         2 4.20  147  176     1  2.12 4.5
# 13     2         2 4.20  147  176     2  3.20 6.3          
person Andrew Lavers    schedule 11.08.2017
comment
Спасибо, пока я думаю, что это работает, несмотря на мой плохой пример. В следующий раз я не забуду установить .seed для значимых столбцов. - person Spencer Castro; 11.08.2017
comment
@SpencerCastro, если этот ответ помог вам решить вашу проблему, вам следует хотя бы подумать о том, чтобы проголосовать за вознаграждение за вложенные усилия и время. - person i.n.n.m; 11.08.2017
comment
Я думал, что моя репутация означает, что мои голоса еще нельзя подсчитать. - person Spencer Castro; 11.08.2017