有没有比 rowwise() 更快的方法将函数 row-wise 应用于 tibble 的一列?
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 计算 Bayesfactor,但是我使用 rowwise() 的方式非常慢(大约 3000 行需要 20 分钟)。你知道有什么更快的方法可以将这个函数应用到小标题的每一行吗?非常感谢。
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
我有一个 tibble df,其中每一行都包含一个列表 (beta),它是后验分布(4000 个样本)。我想使用 bayestestR::bayesfactor_parameters 计算 Bayesfactor,但是我使用 rowwise() 的方式非常慢(大约 3000 行需要 20 分钟)。你知道有什么更快的方法可以将这个函数应用到小标题的每一行吗?非常感谢。
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