gpt4 book ai didi

r - 在 r 中的非等值连接期间,从 data.table 中按组提取条件数据的有效方法

转载 作者:行者123 更新时间:2023-12-04 16:07:14 25 4
gpt4 key购买 nike

我有两个表,一个包含时间序列数据 (dat),另一个包含一些引用点 (pts),用于一系列不同的观察(time.group 和 well)。请查看最小示例表:

set.seed(5)
dat = data.table ( time.group = c (rep ("base", 42), rep ("4h", 42)),
well = c (rep ("A1", 20), rep ("B1", 22), rep ("A1", 19), rep ("B1", 23)),
frame = c(1:20, 1:22, 1:19, 1:23),
signal = runif (84, 0, 1) )

pts = data.table (time.group = c (rep ("base", 2), rep ("4h", 2)),
well = rep (c ("A1", "B1"), 2),
frame.start = c (3, 4, 3, 6),
frame.stop = c (17, 18, 12, 19) )

head (dat)
time.group well frame signal

1: base A1 1 0.2002145
2: base A1 2 0.6852186
3: base A1 3 0.9168758
4: base A1 4 0.2843995
5: base A1 5 0.1046501
6: base A1 6 0.7010575

head (pts)
time.group well frame.start frame.stop
1: base A1 3 17
2: base B1 4 18
3: 4h A1 3 12
4: 4h B1 6 19

我想提取每个 time.group 和 well 的帧,在 dat 表中信号最高,在 pts 表的 frame.start 和 frame.stop 帧之间

这样做最有效的方法是什么,因为我有相当大的数据集,其中包含大量时间、组和孔,以及一些其他类似“信号”的数据列? p>

这些是我到目前为止提出的策略:

示例 1: 这行得通,但我觉得这是多余的/很慢,因为它本质上必须执行两次“by”分组:

dat [pts, .(time.group, well, frame = x.frame, signal), # returns dat's frame column (desired)
on = .(time.group, well, frame >= frame.start, frame <= frame.stop) # non-equi join, groups once
][ ,
.SD [which.max (signal), .(plus = frame)], # extracting frame at max (signal)
by = .(time.group, well)] # groups again
>>>>>
time.group well plus
1: base A1 9
2: base B1 8
3: 4h A1 12
4: 4h B1 8

示例 2: 在这里,如果我将 i.plus 列与第一帧列 (-1) 添加在一起,我会得到正确的数字,但是我不能这样做,它会出错因为在连接后的输出中有两列名为“frame”。

此外,如果每个组的帧不是从 1 开始,它也不会工作:

dat [pts,
on = .(time.group, well, frame >= frame.start, frame <= frame.stop), # non-equi join
.(i.plus = which.max (signal)), # if I add i.plus and the first column frame, -1, it gives what I want, but there are two columns named frame
by = .EACHI
]
>>>>>>
time.group well frame frame i.plus
1: base A1 3 17 7
2: base B1 4 18 5
3: 4h A1 3 12 10
4: 4h B1 6 19 3

示例 3:这也有效并给出了与示例 1 相同的表格,但看起来代码很多:

tmp = 
dat [pts,
on = .(time.group, well, frame >= frame.start, frame <= frame.stop),
.(plus = .I [which.max (signal)] ), # returns row indeces from orginal data.table (dat)
by = .EACHI][["plus"]]

dat [tmp, .(time.group, well, plus = frame)] # extract from original table

Example 4: 而这并没有从dat返回原始帧列,而是从pts返回列,所以我无法访问dat中对应于max(信号)的帧:

dat [pts,
on = .(time.group, well, frame >= frame.start, frame <= frame.stop), # non-equi join
.SD [which.max (signal) ], # does not return original frame column (x.frame), so I can't extract it
by = .EACHI
]
>>>>>>>>
time.group well frame frame signal
1: base A1 3 17 0.9565001
2: base B1 4 18 0.9659641
3: 4h A1 3 12 0.9758776
4: 4h B1 6 19 0.9304595

我不确定我是否应该从一个完全不同的角度来处理这个问题并尝试将 pts 加入到 dat 中,我不知道!非常感谢任何关于是否有更优雅的方法来实现这一点的见解!

我还想指出,提出一个最佳策略来做到这一点非常重要,因为我将多次进行这些类型的数据提取,所以我已经为此绞尽脑汁了一段时间现在:(

谢谢!

最佳答案

这是您要找的吗?

dat[pts, on = .(time.group, well, frame >= frame.start, frame <= frame.stop),
.(plus = x.frame[which.max(signal)]),
by = .EACHI]
# time.group well frame frame plus
# 1: base A1 3 17 9
# 2: base B1 4 18 8
# 3: 4h A1 3 12 12
# 4: 4h B1 6 19 8

出于某种原因,使用 frame 而不是 x.frame,即 frame[which.max(signal)],返回所有NA,我想这是一个 bug .. 能不能请你 file an issue通过链接到这篇文章?谢谢。

关于r - 在 r 中的非等值连接期间,从 data.table 中按组提取条件数据的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48256362/

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