gpt4 book ai didi

r - 将范围的端点与序列合并

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

在我的一个应用程序中,有一段代码根据另一个应用程序中的值从 data.table 对象中检索信息。

# say this table contains customers details
dt <- data.table(id=LETTERS[1:4],
start=seq(as.Date("2010-01-01"), as.Date("2010-04-01"), "month"),
end=seq(as.Date("2010-01-01"), as.Date("2010-04-01"), "month") + c(6,8,10,5),
key="id")

# this one has some historical details
dt1 <- data.table(id=rep(LETTERS[1:4], each=120),
date=seq(as.Date("2010-01-01"), as.Date("2010-04-30"), "day"),
var=rnorm(120),
key="id,date")

# and here I finally retrieve my historical information based one customer detail
#
library(data.table)

myfunc <- function(x) {
# some code
period <- seq(x$start, x$end, "day")
dt1[.(x$id, period)][, mean(var)]
# some code
}

获取我使用的所有结果adply

library(plyr)
library(microbenchmark)
> adply(dt, 1, myfunc)
id start end V1
1: A 2010-01-01 2010-01-07 0.3143536
2: B 2010-02-01 2010-02-09 -0.5796084
3: C 2010-03-01 2010-03-11 0.1171404
4: D 2010-04-01 2010-04-06 0.2384237

> microbenchmark(adply(dt, 1, myfunc))
Unit: milliseconds
expr min lq median uq max neval
adply(dt, 1, myfunc) 8.812486 8.998338 9.105776 9.223637 88.14057 100

您知道一种方法可以避免 adply 调用并在一个 data.table 语句中执行上述操作吗?或者无论如何更快的方法? (非常欢迎标题编辑建议,我想不出更好的了,谢谢)

最佳答案

这是使用 data.tableroll 参数的好地方:

setkey(dt1, id, date)
setkey(dt, id, start)

dt[dt1, roll = TRUE][end >= start,
list(start = start[1], end = end[1], result = mean(var)), by = id]

# benchmark
microbenchmark(OP = adply(dt, 1, myfunc),
Frank = dt[dt1[as.list(dt[,seq.Date(start,end,"day"),by="id"])][,mean(var),by=id]],
eddi = dt[dt1, roll = TRUE][end >= start,list(start = start[1], end = end[1], result = mean(var)), by = id])
#Unit: milliseconds
# expr min lq median uq max neval
# OP 24.436126 29.184786 30.853094 32.493521 50.898664 100
# Frank 9.115676 11.303691 12.081000 13.122753 28.370415 100
# eddi 5.336315 6.323643 6.771898 7.497285 9.531376 100

随着数据集大小的增长,时间差异将变得更加显着。

关于r - 将范围的端点与序列合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17597508/

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