我是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位数据。我认为循环可能是更合适的方法。
如果有人知道如何解决这个问题,我会很感激!
谢谢! 罗伯特
答案 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