gpt4 book ai didi

r - 配对 data.table 中的行

转载 作者:行者123 更新时间:2023-12-04 12:17:29 26 4
gpt4 key购买 nike

我有一个类似于使用以下命令获得的数据表:

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

它有点接近,但由于保留了“类型”列,因此某些行会重复。也许,我可以尝试删除列“时间”和“类型”,然后删除行的后半部分。但是,我不确定这是否适用于所有情况,我想学习一种更好的方法来执行此操作。

最佳答案

假设您的数据看起来像您的示例数据:

dt[, list(part = part[1],
data = data[1],
enter.time = time[1],
exit.time = time[2]),
by = as.integer((seq_len(nrow(dt)) + 1)/2)]
# by = rep(seq(1, nrow(dt), 2), each = 2)]
# ^^^ a slightly shorter and a little more readable alternative

这个想法很简单 - 将行分组为 2 组(即 by 部分),即每组将是一个 A 和一个 B,然后对于每个组先取 part和第一个 data然后进入和退出时间只是第一次和第二次 time分别。如果您遵循手动逻辑,这可能是您执行此操作的方式,从而使其易于阅读(一旦您对 data.table 的工作原理有了一点了解)。

关于r - 配对 data.table 中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16156791/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com