【问题标题】:Merge data frames by time interval in R在R中按时间间隔合并数据帧
【发布时间】:2017-08-11 01:06:55
【问题描述】:

我有两个数据框。一种是带有主体、条件、时间戳、xposition 和 yposition 的眼动追踪数据框。它有超过 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 滚动连接,但更喜欢dplyrfuzzyjoin 的解决方案。提前致谢。

【问题讨论】:

  • 这只是结果结构的一个例子,还是给定数据的完整预期结果?
  • 显示的eyedata与dataframe数据不匹配。
  • 正如@epi99 指出你的输出和解释你的输出数据框不匹配。如果您可以准确地确定您需要什么,您已经尝试过什么,我们可以提供帮助。
  • 抱歉,这只是结果的一个示例。我不确定所需的结果如何与 eyedata 示例不一致,除了在开始时会有很多行,可能是数百行,标记为none,然后是标记为 1 和 2 的许多行每个条件。
  • 好的,我想我已经编辑了任何差异。对于给定的subidcondition,我想要检查眼动追踪中的time 是否介于beginend 之间,如果是,那么trial 的数字是多少与那个时间窗口相关联?将此号码从trial 添加到眼动追踪数据框中的自己的列中。

标签: r merge dplyr intervals fuzzyjoin


【解决方案1】:

这是我尝试过的,但我无法弄清楚其中的差异,因此它可能是一个不完整的答案。此结果的第 12,13 行可能是时间重叠。此外,当使用诸如runif 之类的随机生成函数时,请set.seed -- 这里xposypos 与结果无关,所以不是问题。

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          

【讨论】:

  • 谢谢,到目前为止,尽管我的例子很差,但我认为这很有效。下次我会记得为有意义的列设置.seed。
  • @SpencerCastro 如果此答案指导您解决问题,您至少应该考虑投票以奖励投入的努力和时间。
  • 我认为我的声誉意味着我的选票还不能统计。
猜你喜欢
  • 1970-01-01
  • 2014-06-17
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 2019-06-23
  • 1970-01-01
相关资源
最近更新 更多