是否可以跟踪包装重塑中熔体等功能的进度?

时间:2014-04-23 09:02:27

标签: r progress reshape melt

我知道我可以为自创循环创建进度条或类似的东西。但是,是否可以以某种方式跟踪melt()包中reshape这样的函数的进度。或者,跟踪进度的唯一方法是推断此函数在较小数据集上工作所需的时间?

1 个答案:

答案 0 :(得分:0)

不幸的是,没有简单的方法可以获得一个尚未拥有的功能的进度条。如果你真的很有动力,你可以深入研究source code reshape2并添加功能(或更现代的等效来源tidyr)。如果您有一种逻辑方式来分解数据集,则可以使用purr::map并编写自定义函数来报告其自身的进度。如果您发布数据示例,我很乐意向您展示如何运作。

顺便说一句,可能很难推断出这个函数在较小的数据集上工作所需的时间。"下面的代码重新整形数据集,其中n为1000,10000,100000和1000000,然后计算运行所需的时间。每行数据的时间量变化很大。在我的计算机上,与具有1000000行的数据集相比,具有1000行的数据集的每行时间大24倍。这使得预测melt函数需要多长时间具有挑战性。

library(tidyverse)
library(microbenchmark)

# Create dummy data with different numbers of rows
dummy_1k <-
  tibble(group = 1:1000,
         test1 = rnorm(1000),
         test2 = runif(1000))
dummy_10k <-
  tibble(
    group = 1:10000,
    test1 = rnorm(10000),
    test2 = runif(10000)
  )
dummy_100k <-
  tibble(
    group = 1:100000,
    test1 = rnorm(100000),
    test2 = runif(100000)
  )
dummy_1000k <-
  tibble(
    group = 1:1000000,
    test1 = rnorm(1000000),
    test2 = runif(1000000)
  )

# Define a convenience function to melt our dummy data
molten_dummy <- function(dum_df) {
  reshape2::melt(dum_df, id = "group")
}

# Measure how long it takes to melt a row of data based
# on the number of rows in the tibble
microbenchmark(
  molten_dummy(dummy_1k),
  molten_dummy(dummy_10k),
  molten_dummy(dummy_100k),
  molten_dummy(dummy_1000k),
  times = 1000L, unit = "ms"
) %>%
  tbl_df() %>%
  left_join(tribble(
  ~expr, ~count,
  "molten_dummy(dummy_1k)", 1000,
  "molten_dummy(dummy_10k)", 10000,
  "molten_dummy(dummy_100k)", 100000,
  "molten_dummy(dummy_1000k)", 1000000
)) %>%
  mutate(count = as.integer(count), time_per_row = time / count) %>%
  group_by(count) %>%
  summarise(time_per_row = mean(time_per_row)) %>%
  arrange(count)