我有一个类似于使用以下命令获得的数据表:
dt <- data.table(
time = 1:8,
part = rep(c(1, 1, 2, 2), 2),
type = rep(c('A', 'B'), 4),
data = rep(c(runif(1), 0), 4))
基本上,这样的表包含两种不同类型的实例(A 或 B)。时间列包含请求到达或离开某个部分的时间戳。如果实例类型为 A,则时间戳说明到达时间(进入),如果类型为 B,则时间戳说明离开时间(退出)。
time part type data
1: 1 1 A 0.5842668
2: 2 1 B 0.0000000
3: 3 2 A 0.5842668
4: 4 2 B 0.0000000
5: 5 1 A 0.5842668
6: 6 1 B 0.0000000
7: 7 2 A 0.5842668
8: 8 2 B 0.0000000
我想将A和B实例配对,得到如下数据表:
part data enter.time exit.time
1: 1 0.4658239 1 2
2: 1 0.4658239 5 6
3: 2 0.4658239 3 4
4: 2 0.4658239 7 8
我尝试了以下方法:
pair.types <- function(x) {
a.type <- x[type == 'A']
b.type <- x[type == 'B']
return(data.table(
enter.time = a.type$time,
exit.time = b.type$time,
data = a.type$data))
}
dt[, c('enter.time', 'exit.time', 'data') := pair.types(.SD), by = list(part)]
但是,这给了我以下,这不是我想要的:
time part type data enter.time exit.time
1: 1 1 A 0.3441592 1 2
2: 2 1 B 0.3441592 5 6
3: 3 2 A 0.3441592 3 4
4: 4 2 B 0.3441592 7 8
5: 5 1 A 0.3441592 1 2
6: 6 1 B 0.3441592 5 6
7: 7 2 A 0.3441592 3 4
8: 8 2 B 0.3441592 7 8
它有点接近,但由于保留了“类型”列,所以有些行是重复的。也许,我可以尝试删除列“时间”和“类型”,然后删除行的后半部分。但是,我不确定这是否适用于所有情况,我想学习一种更好的方法来执行此操作。