繁体   English   中英

有没有比 rowwise() 更快的方法将函数逐行应用于小标题的一列?

[英]Is there any faster way than rowwise() to apply a function row-wise to one column of a tibble?

我有一个 tibble df,其中每一行都包含一个列表(beta),它是一个后验分布(4000 个样本)。 我想使用bayestestR::bayesfactor_parameters 计算贝叶斯因子,但是我使用rowwise() 的方式非常慢(大约3000 行需要20 分钟)。 你知道有什么更快的方法可以将此函数应用于 tibble 的每一行吗? 非常感谢。

df <- tibble(idx = seq(1, 3000), beta = list(rnorm(4000, 0.5, 3)))
df <- df %>% 
  slice(1:10) %>% 
  rowwise() %>% 
  mutate(ioi = bayestestR::
           bayesfactor_parameters(posterior = unlist(beta), prior = rnorm(1e4, 0, 10), 
                                  direction = "two-sided", 
                                  null = c(-1, 1))$log_BF) %>% 
  ungroup()

是的! 使用multidplyr并行应用

cluster <- new_cluster(parallel::detectCores() - 2)
cluster_library(cluster, c('tidyverse', 'furrr'))
cluster_copy([...])
df %>% 
    rowwise() %>% 
    partition(cluster) %>% 
    mutate([...]) %>% 
    collect()

您可以尝试以下方法:

library(data.table)
setDT(df)

library(foreach)
doParallel::registerDoParallel()

result = foreach(i=1:nrow(df),.inorder = F,.combine = rbind,.packages = c("data.table", "bayestestR")) %dopar% {
    data.frame(idx=i, log_bf= bayesfactor_parameters(
      posterior = df[i, unlist(beta)],
      prior = rnorm(1e4, 0, 10),
      direction = "two-sided",
      null= c(-1, 1))$log_BF)
}

输出(前 10 行)

   idx    log_bf
1    1 -1.438289
2    2 -1.443515
3    3 -1.446068
4    4 -1.449608
5    5 -1.440932
6    6 -1.446644
7    7 -1.444527
8    8 -1.434655
9    9 -1.457718
10  10 -1.403027

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM