gpt4 book ai didi

R: period.apply 的更快替代方案

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

我准备了以下数据

Timestamp   Weighted Value  SumVal  Group
1 1600 800 1
2 1000 1000 2
3 1000 1000 2
4 1000 1000 2
5 800 500 3
6 400 500 3
7 2000 800 4
8 1200 1000 4

我想计算每个组的 sum(Weighted_Value)/sum(SumVal),例如,对于第 3 组,结果将是 1.2。

我使用 period.apply 来做到这一点:

period.apply(x4, intervalIndex, function(z) sum(z[,4])/sum(z[,2]))

但这对我的应用程序来说太慢了,所以我想问一下是否有人知道更快的替代方案?我已经尝试过 ave,但它似乎更慢。

我的目标是顺便说一句。计算时间加权平均值,将不规则的时间序列转换为等距时间间隔的时间序列。

谢谢!

最佳答案

使用 rowsum 似乎比 data.table 方法更快(至少对于这个小示例数据集而言):

sgibb <- function(datframe) {
data.frame(Group = unique(df$Group),
Avg = rowsum(df$Weighted_Value, df$Group)/rowsum(df$SumVal, df$Group))
}

在@platfort 的基准测试中添加 rowsum 方法:

library(microbenchmark)
library(dplyr)
library(data.table)

microbenchmark(
Nader = df %>%
group_by(Group) %>%
summarise(res = sum(Weighted_Value) / sum(SumVal)),
Henk = setDT(df)[, sum(Weighted_Value) / sum(SumVal), by = Group],
plafort = weight.avg(df),
sgibb = sgibb(df)
)
# Unit: microseconds
# expr min lq mean median uq max neval
# Nader 2179.890 2280.462 2583.8798 2399.0885 2497.6000 6647.236 100
# Henk 648.191 693.519 788.1421 726.0940 751.0810 2386.260 100
# plafort 2638.967 2740.541 2935.4756 2785.7425 2909.4640 5000.652 100
# sgibb 347.125 384.830 442.6447 409.2815 441.8935 2039.563 100

关于R: period.apply 的更快替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30355304/

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