匹配不在同一行和同一列中的特定值

时间:2018-12-26 18:42:31

标签: r tidyverse

我的数据不是按时间顺序生成的,但是,我希望计算参与者在所需时间范围内做出响应时的准确性。我的数据框看起来像这样(简单的示例)

a<-data.frame("time1"=c(6.28,17,49,72), "target"=c(5.8,17.3,71.5,85),"catch"=c(8,48.5,68,80))

我想知道time1(主题响应时间)是否在target时间+ 0.9的附加持续时间范围内发生,如果这样的话,精度为1。但是,time1并非按正确的时间顺序排列,因为参与者也可能对catch做出响应,在这种情况下,准确性为0。另一方面,参与者可能会正确回答,但不在target的同一行中(例如:a$time1[4] = 72是正确的回答,因为它位于正确的范围内:72.4({{1} }:71.5 + 0.9),但不在同一行。

这是预期的结果(第四栏):

a$target[3]

是否有任何建议通过浏览outcome<-data.frame("time1"=c(6.28,17,49,72), "target"=c(5.8,17.3,71.5,85),"catch"=c(8,48.5,68,80), "expOutcome.ACC"=c(1,1,0,1)) target的两列来了解每个time1值是否正确回答?如果可以使用catch / tidyverse包解决问题,将不胜感激。

非常感谢!

1 个答案:

答案 0 :(得分:0)

library(tidyr)
library(dplyr)

a %>% 
  gather(key = event, value = time) %>% 
  arrange(time) %>% 
  mutate(acc = event == "time1" & 
           lag(event, default = "dummy") == "target" &
           time <= lag(time, default = -Inf) + 0.9)

#     event  time   acc
# 1  target  5.80 FALSE
# 2   time1  6.28  TRUE
# 3   catch  8.00 FALSE
# 4   time1 17.00 FALSE
# 5  target 17.30 FALSE
# 6   catch 48.50 FALSE
# 7   time1 49.00 FALSE
# 8   catch 68.00 FALSE
# 9  target 71.50 FALSE
# 10  time1 72.00  TRUE
# 11  catch 80.00 FALSE
# 12 target 85.00 FALSE