gpt4 book ai didi

r - 在滑动窗口中汇总满足条件的交易

转载 作者:行者123 更新时间:2023-12-02 14:36:10 24 4
gpt4 key购买 nike

我们有一个交易表

set.seed(1)
X <- data.table(id = 1:10,
time = c(1,2,5,6,9,12,14,20,21,23),
val = sample(0.1*10^(1:4), 10, replace=TRUE),
code = sample(c('A','A','C','B'), 10, replace=TRUE)
)


id time val code
1: 1 1 10 A
2: 2 2 10 A
3: 3 5 100 C
4: 4 6 1000 A
5: 5 9 1 B
6: 6 12 1000 A
7: 7 14 1000 C
8: 8 20 100 B
9: 9 21 100 A
10: 10 23 1 B

对于每一行,我想计算 code == 'A' 的出现次数以及前几行的 val 总和,其中 previous_row$time >= current_row$时间 - 3 IE。预期结果应该是

    id time  val code count_A_within_3 sum_a_within_3
1: 1 1 10 A 1 10
2: 2 2 10 A 2 20
3: 3 5 100 C 1 10
4: 4 6 1000 A 1 1000
5: 5 9 1 B 1 1000
6: 6 12 1000 A 1 1000
7: 7 14 1000 C 1 1000
8: 8 20 100 B 0 0
9: 9 21 100 A 1 100
10: 10 23 1 B 1 100

是否可以使用 data.tabledplyr 进行有效计算?

真实数据集包含约 1M 个组,其中应在每个组内执行此操作。每组中的行数范围从 1 到 1000。命令式解决方案(带有嵌套 if 和状态变量的 for 循环)是可行的,但非常慢。

最佳答案

使用最新开发版本(1.9.7+)中的非等值连接:

X[, prev.time := time - 3]

X[, c("count_A_within_3", "sum_a_within_3") :=
X[X, on = .(time >= prev.time, time <= time),
.(sum(code == "A"), sum(val[code == "A"])), by = .EACHI][, .(V1, V2)]]
X
# id time val code prev.time count_A_within_3 sum_a_within_3
# 1: 1 1 10 A -2 1 10
# 2: 2 2 10 A -1 2 20
# 3: 3 5 100 C 2 1 10
# 4: 4 6 1000 A 3 1 1000
# 5: 5 9 1 B 6 1 1000
# 6: 6 12 1000 A 9 1 1000
# 7: 7 14 1000 C 11 1 1000
# 8: 8 20 100 B 17 0 0
# 9: 9 21 100 A 18 1 100
#10: 10 23 1 B 20 1 100

您可能需要将内部两个 X 替换为 .SD 以获得更健壮的代码;为了清楚/易于理解它的工作原理,我只将其保留为 X

关于r - 在滑动窗口中汇总满足条件的交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39644730/

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