R - 根据另一列中的值查找时间戳的开始和结束

R - Find the begin and the end of timestamp according with values in another column

亲爱的,

我是R编程的新手,因此,我来​​这里向您寻求帮助。我正在想办法解决这个问题。我一直在努力,但没有成功。

我有一个data.frame类似的...

df2 <- data.frame(Recordig = c("Rec1", "Rec1", "Rec1", "Rec1", "Rec1", "Rec1", 
                               "Rec2","Rec2","Rec2","Rec2","Rec2","Rec2"), 
                  MediaName = c("Imagem1","Imagem1","Imagem1",
                                "Estimulo1","Estimulo1","Estimulo1",
                                "Imagem1","Imagem1","Imagem1",
                                "Estimulo1","Estimulo1","Estimulo1"),
                  Timestamp = c( 4975 , 5155 , 5312 ,25076, 25463 ,26040 , 5035 , 5248, 5551, 17047 , 17263,  17533))

下面是简化版

 Recordig MediaName Timestamp
1      Rec1   Imagem1      4975
2      Rec1   Imagem1      5155
3      Rec1   Imagem1      5312
4      Rec1 Estimulo1     25076
5      Rec1 Estimulo1     25463
6      Rec1 Estimulo1     26040
7      Rec2   Imagem1      5035
8      Rec2   Imagem1      5248
9      Rec2   Imagem1      5551
10     Rec2 Estimulo1     17047
11     Rec2 Estimulo1     17263
12     Rec2 Estimulo1     17533

我的意思是什么?我需要确切地知道参与者(例如 Rec1)在查看每张图像 (Image1) 上花费了多少时间。在这种情况下,Image1 的时间戳从 4.975 秒开始到 5.312 秒结束,给出 333 毫秒

重点是我有数百张图片和数千名受访者,他们花了不同的时间来观察这些图片。

请问有没有人能帮帮我?

您可以使用 dplyr 包找到每个参与者 (Recordig) 和图像 (MediaName) 的第一个和最后一个时间戳之间的差异:

library(dplyr)
df3 <- df2 %>% 
        dplyr::group_by(Recordig, MediaName) %>%
        dplyr::summarise(duration = diff(range(Timestamp)))

df3
# Source: local data frame [4 x 3]
# Groups: Recordig [?]
# 
#   Recordig MediaName duration
#     <fctr>    <fctr>    <dbl>
# 1     Rec1 Estimulo1      964
# 2     Rec1   Imagem1      337
# 3     Rec2 Estimulo1      486
# 4     Rec2   Imagem1      516

我们可以使用base R

aggregate(cbind(duration = Timestamp) ~Recordig + MediaName, df2,
               FUN = function(x) diff(range(x)))
#    Recordig MediaName duration
#1     Rec1 Estimulo1      964
#2     Rec2 Estimulo1      486
#3     Rec1   Imagem1      337
#4     Rec2   Imagem1      516