R语言 计数另一事件的时间段内事件发生的次数

lb3vh1jj  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(133)

我很难找出最好的方法来计算在另一个事件之前和之后10秒发生的事件数量。
我有多个受试者在进行多个实验环节,在我的 Dataframe 中,我有:

  • 主题
  • 届会
  • 事件1计数
  • 事件1时间戳(每个事件占一行)
  • Event2标签(4种不同类型的事件类型)
  • 事件2时间戳

例如:
| 主题|届会|事件1计数|事件1时间戳|事件2标签|事件2时间戳|
| - ------|- ------|- ------|- ------|- ------|- ------|
| K1|一|1个|四百七十六|不适用|不适用|
| K1|一|第二章|小行星2444|不适用|不适用|
| K1|一|三个|小行星4922|不适用|不适用|
| K1|一|不适用|不适用|类型1|四八三|
| K1|一|不适用|不适用|类型1|小行星2448|
| K1|一|不适用|不适用|类型2|小行星2452|
| K1|一|不适用|不适用|类型2|小行星4920|
| 第二层|一|1个|三十五|不适用|不适用|
| 第二层|一|第二章|三一零|不适用|不适用|
| 第二层|一|三个|小行星1933|不适用|不适用|
| 第二层|二|不适用|不适用|第2类|三十|
| 第二层|二|不适用|不适用|第2类|三十二|
| 第二层|二|不适用|不适用|第2类|三零五|
| 第二层|二|不适用|不适用|类型1|小行星1941|
| K1|二|1个|一百三十一|不适用|不适用|
| K1|二|第二章|六五九|不适用|不适用|
| K1|二|三个|小行星3802|不适用|不适用|
| K1|二|不适用|不适用|类型1|一百三十七|
| K1|二|不适用|不适用|类型1|六五七|
| K1|二|不适用|不适用|类型1|六六五|
我希望计算每个Event1出现之前和之后10秒内出现的每个Event2类型的数量。从上面的示例中,我希望接收:
| 主题|届会|事件1计数|前事件1类型1|事件1后类型1|事件前1类型2|事件1后类型2|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| K1|一|1个|无|1个|无|无|
| K1|一|第二章|无|1个|无|1个|
| K1|一|三个|1个|无|无|无|
| 第二层|一|1个|无|无|第二章|无|
| 第二层|一|第二章|无|无|1个|无|
| 第二层|一|三个|无|1个|无|无|
| K1|二|1个|无|1个|无|无|
| K1|二|第二章|1个|1个|无|无|
| K1|二|三个|无|无|无|无|
这些信息可以在一个新的 Dataframe 中,也可以添加到同一个 Dataframe 中,这并不重要。我遇到困难的是条件计数。
我希望这个解释是有道理的。我本可以把这个例子说得更清楚。
我尝试了针对本论坛上发布的其他问题建议的各种方法,但没有成功,因为许多其他问题都设置了时间窗口,并且只查看1列数据,而我尝试根据不同列每行中某个时间之前和之后的时间来计算1列中的行数。
这可能是因为我没有有效地组织我的数据,对于事件1和事件2数据使用单独的 Dataframe 会更容易。

ipakzgxi

ipakzgxi1#

你想要的输出似乎与你的标准/样本数据不匹配。。但我相信你正在寻找这样的东西?

library(data.table)
#if not a data.table format already, make it so
setDT(DT)

# first, split into two parts
DT1 <- DT[!is.na(Event1Count), ]
DT2 <- DT[is.na(Event1Count), ]

# create unique item for each row, to iterate over later (using .EACHI)
DT1[, id := .I]
# set the data.table key
setkey(DT1, id)
# perform a self join, using each row to filter DT2 and pass results
DT1[DT1, c("PreEvent1Type1", "PostEvent1Type1", "PreEvent1Type2",   "PostEvent1Type2") := {
  temp <- DT2[Subject == i.Subject & 
                Session == i.Session & 
                Event2Timestamp >= (i.Event1Timestamp - 10) & 
                Event2Timestamp <= (i.Event1Timestamp + 10), ]
  list(nrow(temp[Event2Label == "Type1" & Event2Timestamp < i.Event1Timestamp, ]),
       nrow(temp[Event2Label == "Type1" & Event2Timestamp >= i.Event1Timestamp, ]),
       nrow(temp[Event2Label == "Type2" & Event2Timestamp < i.Event1Timestamp, ]),
       nrow(temp[Event2Label == "Type2" & Event2Timestamp >= i.Event1Timestamp, ]))
}, by = .EACHI][, c(1:3,8:11)] # <-- this last vector is to select desired columns

#    Subject Session Event1Count PreEvent1Type1 PostEvent1Type1 PreEvent1Type2 PostEvent1Type2
# 1:      K1       1           1              0               1              0               0
# 2:      K1       1           2              0               1              0               1
# 3:      K1       1           3              0               0              1               0
# 4:      L2       1           1              0               0              0               0
# 5:      L2       1           2              0               0              0               0
# 6:      L2       1           3              0               0              0               0
# 7:      K1       2           1              0               1              0               0
# 8:      K1       2           2              1               1              0               0
# 9:      K1       2           3              0               0              0               0

使用的示例数据

DT <- fread("Subject    Session     Event1Count     Event1Timestamp     Event2Label     Event2Timestamp
K1  01  1   476     NA  NA
K1  01  2   2444    NA  NA
K1  01  3   4922    NA  NA
K1  01  NA  NA  Type1   483
K1  01  NA  NA  Type1   2448
K1  01  NA  NA  Type2   2452
K1  01  NA  NA  Type2   4920
L2  01  1   35  NA  NA
L2  01  2   310     NA  NA
L2  01  3   1933    NA  NA
L2  02  NA  NA  Type2   30
L2  02  NA  NA  Type2   32
L2  02  NA  NA  Type2   305
L2  02  NA  NA  Type1   1941
K1  02  1   131     NA  NA
K1  02  2   659     NA  NA
K1  02  3   3802    NA  NA
K1  02  NA  NA  Type1   137
K1  02  NA  NA  Type1   657
K1  02  NA  NA  Type1   665")

相关问题