R 通过两列值的范围查找数据帧中的匹配间隔
我有一个时间相关事件的数据框架 以下是一个例子:R 通过两列值的范围查找数据帧中的匹配间隔,r,dplyr,R,Dplyr,我有一个时间相关事件的数据框架 以下是一个例子: Name Event Order Sequence start_event end_event duration Group JOHN 1 A 0 19 19 ID1 JOHN 2 A 60
Name Event Order Sequence start_event end_event duration Group
JOHN 1 A 0 19 19 ID1
JOHN 2 A 60 112 52 ID1
JOHN 3 A 392 429 37 ID1
JOHN 4 B 282 329 47 ID1
JOHN 5 C 147 226 79 ID1
JOHN 6 C 566 611 45 ID1
ADAM 1 A 19 75 56 ID2
ADAM 2 A 384 407 23 ID2
ADAM 3 B 0 79 79 ID2
ADAM 4 B 505 586 81 ID2
ADAM 5 C 140 205 65 ID2
ADAM 6 C 522 599 77 ID2
基本上有两个不同的组,ID 1和ID 2。对于每个组,有18个不同的名称。每个人都以3种不同的顺序出现,A-C。然后他们在这些顺序中有活跃的时间段,我标记开始/结束事件并计算持续时间
我想隔离每个人,并找出他们与相反组ID和相同组ID中的人的时间间隔是否匹配
使用上面的示例数据,我想找出John和Adam在同一时间出现在同一序列中的时间。然后我想将John与ID1/ID2中的17个名字中的其他人进行比较
我不需要匹配共享的“活动”时间的确切数量,我只是希望隔离常见的行
我的安慰是在使用dplyr,但我还不能破解这个。我环顾四周,看到了一些类似的例子,有邻接矩阵,但这些例子都有精确的数据点。我无法用一个范围/间隔来计算策略
谢谢大家!
更新:
下面是所需结果的示例
Name Event Order Sequence start_event end_event duration Group
JOHN 3 A 392 429 37 ID1
JOHN 5 C 147 226 79 ID1
JOHN 6 C 566 611 45 ID1
ADAM 2 A 384 407 23 ID2
ADAM 5 C 140 205 65 ID2
ADAM 6 C 522 599 77 ID2
我认为您应该为John隔离每个事件行,标记开始/结束时间帧,然后在数据帧的其余部分遍历每个名称和事件,以找到首先符合相同序列的时间点,然后再针对John的基准标记开始/结束时间帧 据我所知,您希望返回具有特定序列号的John事件与具有相同序列值的其他任何人的事件重叠的任何行。要实现此目的,可以使用“拆分应用合并”按顺序拆分,标识重叠行,然后重新合并:
overlap <- function(start1, end1, start2, end2) pmin(end1, end2) > pmax(start2, start1)
do.call(rbind, lapply(split(dat, dat$Sequence), function(x) {
jpos <- which(x$Name == "JOHN")
njpos <- which(x$Name != "JOHN")
over <- outer(jpos, njpos, function(a, b) {
overlap(x$start_event[a], x$end_event[a], x$start_event[b], x$end_event[b])
})
x[c(jpos[rowSums(over) > 0], njpos[colSums(over) > 0]),]
}))
# Name EventOrder Sequence start_event end_event duration Group
# A.2 JOHN 2 A 60 112 52 ID1
# A.3 JOHN 3 A 392 429 37 ID1
# A.7 ADAM 1 A 19 75 56 ID2
# A.8 ADAM 2 A 384 407 23 ID2
# C.5 JOHN 5 C 147 226 79 ID1
# C.6 JOHN 6 C 566 611 45 ID1
# C.11 ADAM 5 C 140 205 65 ID2
# C.12 ADAM 6 C 522 599 77 ID2
如果希望能够计算指定用户对的重叠,可以通过将操作包装到指定要处理的用户对的函数中来完成:
overlap <- function(start1, end1, start2, end2) pmin(end1, end2) > pmax(start2, start1)
pair.overlap <- function(dat, user1, user2) {
dat <- dat[dat$Name %in% c(user1, user2),]
do.call(rbind, lapply(split(dat, dat$Sequence), function(x) {
jpos <- which(x$Name == user1)
njpos <- which(x$Name == user2)
over <- outer(jpos, njpos, function(a, b) {
overlap(x$start_event[a], x$end_event[a], x$start_event[b], x$end_event[b])
})
x[c(jpos[rowSums(over) > 0], njpos[colSums(over) > 0]),]
}))
}
此软件包应该有帮助:从
数据中签出?foverlaps
。表软件包和/或[0,19]
对于A,John with[19.75]
对于A,Adam?@Arun I在重叠函数中使用
不包括重叠为0的情况。如果OP希望包括端点接触但间隔之间没有重叠的情况,他们可以将其更改为重叠中的=
。这里的重叠为1,而不是0。因此,您使用的闭合间隔[]
具有误导性。共有17个名称,OP希望对所有这些名称进行比较them@wetcoaster前两个代码块处理一个名称(在本例中为John)与所有其他名称的所有重叠。您可以简单地将“JOHN”更改为其他名称,以检查不同名称的所有重叠。
overlap <- function(start1, end1, start2, end2) pmin(end1, end2) > pmax(start2, start1)
pair.overlap <- function(dat, user1, user2) {
dat <- dat[dat$Name %in% c(user1, user2),]
do.call(rbind, lapply(split(dat, dat$Sequence), function(x) {
jpos <- which(x$Name == user1)
njpos <- which(x$Name == user2)
over <- outer(jpos, njpos, function(a, b) {
overlap(x$start_event[a], x$end_event[a], x$start_event[b], x$end_event[b])
})
x[c(jpos[rowSums(over) > 0], njpos[colSums(over) > 0]),]
}))
}
apply(combn(unique(as.character(dat$Name)), 2), 2, function(x) pair.overlap(dat, x[1], x[2]))