gpt4 book ai didi

r - 聚合效率低于循环?

转载 作者:行者123 更新时间:2023-12-05 00:52:30 24 4
gpt4 key购买 nike

我试图在一个大表上执行此操作,以计算 data.table X 中具有不同 a 和 b 组合的行。

Y <- aggregate(c ~ a+b,X,length)

尽管 RAM 使用量仍然存在,但它需要永远(我在 30 分钟后停止)。

然后我尝试手动遍历 b 的值并且仅在 a 上聚合(技术上仍然在 b 上聚合,但每次都只有一个值 b):
sub_agg <- list()
unique_bs <- unique(X$b)
for (b_it in unique_bs){
sub_agg[[length(sub_agg)+1]] <- aggregate(c ~ a + b,subset(X, b == b_it),length)
}
Y <- do.call(rbind, sub_agg )

我在 3 分钟内完成了。

我不妨更进一步,完全摆脱聚合,只对子集进行操作。

聚合比嵌套循环和子集操作效率低还是这是一个特例?

聚合通常是代码中花费最多时间的部分,所以我现在考虑总是尝试循环,我想更好地了解这里发生了什么。

附加信息:

X has 20 million rows

50 distinct values for b

15 000 distinct values for a

最佳答案

是的,聚合的效率低于您在那里使用的循环,因为:

  • 当数据点数量增加时,聚合变得不成比例地变慢。您的第二个解决方案使用 aggregate在小子集上。其中一个
    原因是aggregate取决于排序,排序不是在 O(n) 时间内完成的。
  • 聚合也使用 expand.grid在内部,它创建一个数据框,其中包含变量 a 和 b 中所有唯一值的所有可能组合。您可以在aggregate.data.frame的内部代码中看到这一点。 .此外,随着观察次数的增加,此功能变得不成比例地变慢。
  • 编辑:我的最后一点并没有真正意义,因为您确实将所有内容合并到了一个数据框中。

  • 也就是说,绝对没有理由使用 aggregate这里。我来数据框 Y只需使用 table :
    thecounts <- with(X, table(a,b))
    Y <- as.data.frame(thecounts)

    此解决方案比您使用 aggregate 提出的解决方案快得多。 .准确地说是在我的机器上 68 次...

    基准:
            test replications elapsed relative 
    1 aggloop() 1 15.03 68.318
    2 tableway() 1 0.22 1.000

    基准测试代码(请注意,我将所有内容都缩小了一点,以免阻塞我的 R
    时间过长):
    nrows <- 20e5

    X <- data.frame(
    a = factor(sample(seq_len(15e2), nrows, replace = TRUE)),
    b = factor(sample(seq_len(50), nrows, replace = TRUE)),
    c = 1
    )

    aggloop <- function(){
    sub_agg <- list()
    unique_bs <- unique(X$b)
    for (b_it in unique_bs){
    sub_agg[[length(sub_agg)+1]] <- aggregate(c ~ a + b,subset(X, b == b_it),length)
    }
    Y <- do.call(rbind, sub_agg )
    }

    tableway <- function(){
    thecounts <- with(X, table(a,b))
    Y <- as.data.frame(thecounts)
    }

    library(rbenchmark)

    benchmark(aggloop(),
    tableway(),
    replications = 1
    )

    关于r - 聚合效率低于循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42629386/

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