首页 > 解决方案 > 在 R 中计算分组 data.frame 期间,是否有一种优雅的方式来显示进度条?

问题描述

我正在将一个复杂的函数应用于分组的 data.frame。为简单起见,在这里,此函数将被视为 colSums 函数。假设我们有以下data.frame:

df <- data.frame(A=runif(600000,0,1),
                 B=rep(c("group1", "group2","group3","group4","group5","group6"), 100000))

此外,我想执行一个 dplyr 链:

df <- df %>%
    group_by(.data$B) %>%
    summarize(colSums(across()))

在此计算期间,我希望有一个进度条显示剩余时间。例如:

[==========================>] 100%

我知道 dplyr 中有解决方案,但据我所知,它们已被取代。因此,我想使用包 Progress。此进度条基于 for 循环期间的刻度更新。我想知道,这个 dplyr 链是否可行。到目前为止,我无法提出解决方案。有任何想法吗?

标签: rdataframedplyrprogress-bargrouping

解决方案


这是一个使用进度包的解决方案。您必须初始化进度条并告诉它组/刻度的数量。然后在您的自定义计算中,您增加条形。

library(tidyverse)
library(progress)

df <- data.frame(A=runif(600000,0,1),
                 B=rep(c("group1", "group2","group3","group4","group5","group6"), 100000)) %>% 
    group_by(B)

my_slow_function <- function(col){
    pb$tick()
    Sys.sleep(0.5)
    sum(col)
}

num_ticks <- n_groups(df)
pb <- progress_bar$new(format = "[:bar] :current/:total (:percent) elapsed :elapsed eta :eta",
                       total = num_ticks)


df %>% 
    summarize(output = my_slow_function(A))

推荐阅读