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