gpt4 book ai didi

r - 如何使用 data.table 计算 R 中不均匀间隔数据的滚动统计量

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

我有一个由两个 ID 变量(一个嵌套在另一个变量中)和日期索引的数据集,我希望计算此数据中的滚动统计量。

我的真实数据集很大(约 2 亿行),我很享受在其他任务上使用 data.table 的速度提升……但我无法找到最佳使用 data.table 的方法(即利用二分搜索并避免矢量扫描)在这个问题。

样本数据:

set.seed(3)
dt1 <-
data.table(id1=c(rep("a",124),rep("b",124)),
id2=c(rep("x",62),rep("y",62)),
date=seq(as.Date("2012-05-01"),as.Date("2012-07-01"),"days"),
var1=rpois(124,14),
var2=rpois(124,3))
setkey(dt1,id1,id2,date)
# create uneven time spacing
dt1 <- dt1[-c(5,10,36,46,58)]

我的最终目标是计算 id1/id2 内每一天的“滚动统计”,即:

总和(var2)/总和(var1)

包括具有相同 id1/id2 组合的所有其他行,以及该行之前的 30 天。

我不确定这是一个好的第一步,但为了清楚起见,这里是在 Date=2012-06-12 上获得所有 ID 所需结果的代码:
dt1[date < as.Date("2012-06-12") & date > as.Date("2012-06-12")-31,
list("newstat"=sum(var1)/sum(var2),
"date"=as.Date("2012-06-12")),by=list(id1,id2)]

id1 id2 newstat date
1: a x 3.925 2012-06-12
2: a y 4.396 2012-06-12
3: b x 3.925 2012-06-12
4: b y 4.396 2012-06-12

我想尝试对 id1 和 id2 进行笛卡尔自联接,然后将生成的 data.table 减少到适当的日期范围(我不知道如何一步完成)。这给了我想要的结果,但是,如果不使用逻辑子集作为 i 在减少步骤中的参数,我不确定如何做到这一点,这非常慢。我想我当时没有利用 data.table 的键,但不知道如何解决这个问题......

例子:
dt1[setkey(dt1[,list(id1,id2,"date_grp"=date)],id1,id2),
list(date_grp,date,var1,var2)][
# Here comes slow subset
date<date_grp & date > date_grp-30,
list("newstat"=sum(var1)/sum(var2)),
by=list(id1,id2,date_grp)]

结果:
     id1 id2   date_grp newstat
1: a x 2012-05-02 0.4286
2: a x 2012-05-03 0.4000
3: a x 2012-05-04 0.2857
4: a x 2012-05-06 0.2903
5: a x 2012-05-07 0.3056
---
235: b y 2012-06-27 0.2469
236: b y 2012-06-28 0.2354
237: b y 2012-06-29 0.2323
238: b y 2012-06-30 0.2426
239: b y 2012-07-01 0.2304

最佳答案

我确定有更好的方法可以做到这一点,但您可以做的一件事是避免完全笛卡尔连接,这会通过使用连接键生成临时表来杀死您:

dt.dates <- dt1[, list(date.join=seq(as.Date(date - 1, origin="1970-01-01"), by="-1 day", len=30)), by=list(date, id1, id2)]

对于每个 date-id 组,我们现在生成了允许加入日期的列表。现在我们重新加入数据并计算我们的指标。
setkey(dt.dates, date.join, id1, id2)
setkey(dt1,date,id1,id2)
dt.dates[dt1][ , sum(var1)/sum(var2), by=list(id1, id2, date)]

我无法复制 6/12 的结果,但我认为我们存在播种问题。相比:
> dt.date.join[dt1][ , sum(var1)/sum(var2), by=list(id1, id2, date)][date=="2012-06-12"]
id1 id2 date V1
1: a x 2012-06-12 3.630631
2: a y 2012-06-12 4.434783
3: b x 2012-06-12 3.634783
4: b y 2012-06-12 4.434783
> dt1[date < as.Date("2012-06-12") & date > as.Date("2012-06-12")-31, list("newstat"=sum(var1)/sum(var2), "date"=as.Date("2012-06-12")),by=list(id1,id2)]
id1 id2 newstat date
1: a x 3.630631 2012-06-12
2: a y 4.434783 2012-06-12
3: b x 3.634783 2012-06-12
4: b y 4.434783 2012-06-12

结果基本一样。

关于r - 如何使用 data.table 计算 R 中不均匀间隔数据的滚动统计量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22648954/

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