使用来自R中的不同数据帧的值来循环用于子集高于和低于数据帧中的值

时间:2016-11-14 19:53:50

标签: r

我是R的新手,我有一个问题,我想问你们这些人!

我有一个带有TimeStamps的大型数据框,来自眼球跟踪实验。

  

Blockquote ParticipantName RecordingTimestamp GazeEventType GazeEventDuration AOI[Prob]Hit AOI[Prob 2]Hit 1 1 -1255 NA NA NA 2 1 -1252 Fixation 933 NA NA 3 1 -1249 Fixation 933 NA NA 4 1 -1245 Fixation 933 NA NA 5 1 -1242 Fixation 933 NA NA 6 1 -1239 Fixation 933 NA NA

我在另一个数据框中有事件触发器。我操纵了它们,现在我有两列,一列是开始时间,另一列是结束时间。

  

Blockquote ParticipantName TimeStamp Event EventFinish 1 1 6593 10 4593 2 1 27235 2 25235 3 1 27392 10 25392 4 1 47278 1 45278 5 1 47440 10 45440 6 1 71857 2 69857

如果时间戳是事件的结束而且EventFinish是开始(与那里的名字混淆,抱歉!)

因此,第一个数据帧大约有140.000行,时间戳为-1255,最高为455251。

我需要从第二个数据帧中获取值,并根据第一个数据帧的RecordingTimestamp值高于EventFinish并低于第二个数据帧的Timestamp列来制作子集或过滤器。对于secon数据框中的24行中的每一行。

这样我就可以消除不是我的epoched数据的行。

我在循环,过滤器和子集周围闲逛,但我无法做到正确。

我已尝试过此代码:

for(i in 1:EventPP1$TimeStamp){
  for (j in 1:EventPP1$EventFinish){

  test3<- subset(Participant1, Participant1$RecordingTimestamp>=EventPP1$EventFinish[j] & Participant1$RecordingTimestamp<=EventPP1$TimeStamp[i] )
  }
}

但是R只是继续下去并且永远不会得到最终答案。

我也试过这段代码:

uniq1<- unique(unlist(EventPP1$TimeStamp)) 
uniq1<- as.data.frame(uniq1)
uniq2<- unique(unlist(EventPP1$EventFinish)) 
uniq2<- as.data.frame(uniq2)
for(i in 1:seq_along(uniq1)){
  for (j in 1:seq_along(uniq2)){

    test3<- filter(Participant1, Participant1$RecordingTimestamp>=uniq2[j] & Participant1$RecordingTimestamp<=uniq1[i] )
  }
}

但它只能得到我的最后一对,而不是其余的。

有人能帮帮我吗?该数据仅来自一位参与者,而我还有大约80位数据。我认为循环可能是更合适的方法。

如果有人知道如何解决这个问题,我会很感激!

谢谢! 罗伯特

1 个答案:

答案 0 :(得分:0)

您必须只循环一次,而不是遍历时间戳,而是遍历第二个数据框中的行。对于每一行,您都有一个begin值和一个end值,您可以标记第一个数据框中属于这些限制的所有数据。如果我调用您的数据框p(对于参与者)和E(对于事件),并给列短名称:

for (i in 1:length(E$ts)){    # note you loop over the 24 lines only
  p$flag[p$ts>=E$start[i] & p$ts <= E$fin[i]] <-1 # set a flag to 1 for good data
}
p<-p[p$flag==1]   # restrict your data frame to flagged data