Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用multdplyr将不同的dplyr::mutate cols发送到不同的核心?_R_Dplyr_Parallel Processing_Multidplyr - Fatal编程技术网

使用multdplyr将不同的dplyr::mutate cols发送到不同的核心?

使用multdplyr将不同的dplyr::mutate cols发送到不同的核心?,r,dplyr,parallel-processing,multidplyr,R,Dplyr,Parallel Processing,Multidplyr,我有一个函数,我正在应用于不同的坐标集,以在我的tibble中创建四个新列。这个函数有相当长的启动时间(将基因组加载到RAM中,将tibble转换为GRanges,并检索序列),但速度相对较快,因此100和1000000个序列之间没有太大差异。有没有办法将mutate中的每个列发送到不同的核心,以便可以同时处理它们?我考虑过使用pivot\u long,然后使用group+分区,但这让我思考是否有其他方法来实现这一点。一种多重变异排序? (在我的例子中,考虑到额外坐标的成本很小,我并不期望mul

我有一个函数,我正在应用于不同的坐标集,以在我的tibble中创建四个新列。这个函数有相当长的启动时间(将基因组加载到RAM中,将tibble转换为GRanges,并检索序列),但速度相对较快,因此100和1000000个序列之间没有太大差异。有没有办法将
mutate
中的每个列发送到不同的核心,以便可以同时处理它们?我考虑过使用
pivot\u long
,然后使用
group
+
分区
,但这让我思考是否有其他方法来实现这一点。一种
多重变异
排序?

(在我的例子中,考虑到额外坐标的成本很小,我并不期望multipyr分区/收集能够节省时间,但是如果我能够避免旋转的时间成本(它仍然相对较小)和代码中的混乱,那就太酷了。)

我知道您正在寻找一个现有的包,但是我在上面找不到任何东西。其他类似的问题(如或)似乎也没有提供一揽子解决方案

但是,你自己解决怎么样。。。使用
furr
查看此示例

### libraries
library(dplyr)
library(furrr)

### data complaint with your example
d <- replicate(8, rnorm(100))
colnames(d) <- apply(expand.grid(letters[1:2], 1:4), 1, paste0, collapse = "")
d <- as_tibble(d)

### a function that take more than a second to finish..
long_f <- function(x1, x2){
  
  Sys.sleep(1)
  x1+x2
  
}

### multimutate!
multimutate <- function(.data, ..., .options = future_options()){
  
  dots <- enquos(..., .named = TRUE)
  .data[names(dots)] <- future_map(dots, ~rlang::eval_tidy(., data = .data, env = parent.frame()), .options = .options)
  .data
  
}


# no future strategy implemented
tictoc::tic()
d %>%
  multimutate(c1 = long_f(a1,b1), 
              c2 = long_f(a2,b2),
              c3 = long_f(a3,b3), 
              c4 = long_f(a4,b4))  
tictoc::toc()
# 4.34 sec elapsed

# future strategy
plan(multiprocess)
tictoc::tic()
d %>%
  multimutate(c1 = long_f(a1,b1), 
              c2 = long_f(a2,b2),
              c3 = long_f(a3,b3), 
              c4 = long_f(a4,b4),
              .options = future_options(globals = "long_f"))  
tictoc::toc()
# 1.59 sec elapsed
###库
图书馆(dplyr)
图书馆(Furr)
###用你的例子说明数据投诉

d我知道你在寻找一个现有的软件包,但我在上面找不到任何东西。其他类似的问题(如或)似乎也没有提供一揽子解决方案

但是,你自己解决怎么样。。。使用
furr
查看此示例

### libraries
library(dplyr)
library(furrr)

### data complaint with your example
d <- replicate(8, rnorm(100))
colnames(d) <- apply(expand.grid(letters[1:2], 1:4), 1, paste0, collapse = "")
d <- as_tibble(d)

### a function that take more than a second to finish..
long_f <- function(x1, x2){
  
  Sys.sleep(1)
  x1+x2
  
}

### multimutate!
multimutate <- function(.data, ..., .options = future_options()){
  
  dots <- enquos(..., .named = TRUE)
  .data[names(dots)] <- future_map(dots, ~rlang::eval_tidy(., data = .data, env = parent.frame()), .options = .options)
  .data
  
}


# no future strategy implemented
tictoc::tic()
d %>%
  multimutate(c1 = long_f(a1,b1), 
              c2 = long_f(a2,b2),
              c3 = long_f(a3,b3), 
              c4 = long_f(a4,b4))  
tictoc::toc()
# 4.34 sec elapsed

# future strategy
plan(multiprocess)
tictoc::tic()
d %>%
  multimutate(c1 = long_f(a1,b1), 
              c2 = long_f(a2,b2),
              c3 = long_f(a3,b3), 
              c4 = long_f(a4,b4),
              .options = future_options(globals = "long_f"))  
tictoc::toc()
# 1.59 sec elapsed
###库
图书馆(dplyr)
图书馆(Furr)
###用你的例子说明数据投诉

你能分享一下你现在所拥有的最简单的例子吗?我更想问的是,像
multi_mutate
这样的东西是否存在,而不是帮助你处理一个特定的代码块,但是肯定的。我目前所做的基本上是
d%>%突变(c1=long_f(a1,b1),c2=long_f(a2,b2),c3=long_f(a3,b3),c4=long_f(a4,b4))
其中a/b列是整数列,c列是结果字符串(基因组序列)。我可以将一个ID列和pivot_设置得更长,按ID分组,然后在组上使用传统的multdplyr分区,但如果可能的话,我更愿意避免前后旋转。似乎应该可以将每个变种发送到一个不同的核心。你能分享一个你现在拥有的最简单的例子吗?我更想问的是,是否存在类似于
multi_mutate
的东西,而不是帮助处理特定的代码块,但这是肯定的。我目前所做的基本上是
d%>%突变(c1=long_f(a1,b1),c2=long_f(a2,b2),c3=long_f(a3,b3),c4=long_f(a4,b4))
其中a/b列是整数列,c列是结果字符串(基因组序列)。我可以将一个ID列和pivot_设置得更长,按ID分组,然后在组上使用传统的multdplyr分区,但如果可能的话,我更愿意避免前后旋转。似乎应该可以将每个变异发送到不同的核心。这太神奇了!:D谢谢。根据警告,考虑到分叉的不稳定性,这看起来确实可能与Windows和/或RStudio存在兼容性问题,但它对我来说非常适合,因为我总是在Mac或Linux机器上工作。在任何情况下,我都不知道Furr,将来肯定会使用它。我在windows和future_选项上试用过它。太棒了!我一定是误解了警告。它似乎不知道从源代码脚本或包导入的函数在哪里(除非用package::function声明)。我需要修改eval_tidy env变量吗?这不是您使用future_选项的方式。太长了,无法在此解释这太神奇了!:D谢谢。根据警告,考虑到分叉的不稳定性,这看起来确实可能与Windows和/或RStudio存在兼容性问题,但它对我来说非常适合,因为我总是在Mac或Linux机器上工作。在任何情况下,我都不知道Furr,将来肯定会使用它。我在windows和future_选项上试用过它。太棒了!我一定是误解了警告。它似乎不知道从源代码脚本或包导入的函数在哪里(除非用package::function声明)。我需要修改eval_tidy env变量吗?这不是您使用future_选项的方式。太长了,无法在此解释