gpt4 book ai didi

r - 并行计算,dplyr 中 tidyr::complete 的替代方法是什么?

转载 作者:行者123 更新时间:2023-12-03 14:40:21 24 4
gpt4 key购买 nike

我正在尝试并行化管道。
在管道中有一个 tidyr 命令(“tidyr::complete”)。一旦并行运行,这就会分解代码,因为无法识别对象类。
dplyr 中是否有替代方法可以完成?

library(dplyr)
library(tidyr)
library(zoo)


test <- tibble(year=c(1,2,3,4,5,5,1,4,5),
var_1=c(1,1,1,1,1,1,2,2,2),
var_2=c(1,1,1,1,1,2,3,3,3),
var_3=c(0,5,NA,15,20,NA,1,NA,NA))

max_year <- max(test$year,na.rm = T)
min_year <- min(test$year,na.rm = T)

序列号

test_serial <- test %>%
group_by(var_1,var_2) %>%
complete(var_1, year = seq(min_year,max_year)) %>%
mutate(
var_3 = na.approx(var_3,na.rm = FALSE),
var_3 = if(all(is.na(var_3))) NA else na.spline(var_3,na.rm = FALSE))


平行 (这失败了)
devtools::install_github("hadley/multidplyr")
library(multidplyr)

cl <- new_cluster(2)
cluster_copy(cl, c("test","max_year","min_year"))
cluster_library(cl, c("dplyr","tidyr","zoo"))

test_parallel <- test %>% group_by(var_1,var_2) %>% partition(cl)
test_parallel <- test_parallel %>%
dplyr::group_by(var_1,var_2) %>%
tidyr::complete(var_1, year = seq(min_year,max_year)) %>%
dplyr::mutate(
var_3 = na.approx(var_3,na.rm = FALSE),
var_3 = if(all(is.na(var_3))) NA else na.spline(var_3,na.rm = FALSE)) %>%
collect()

这是错误信息
Error in UseMethod("complete_") : 
no applicable method for 'complete_' applied to an object of class "multidplyr_party_df"

最佳答案

Multidplyr 允许您:

  • 使用 partition() 拆分数据
  • 处理专用节点上的每个分区
  • collect()结果

  • 并非所有数据处理任务都适合之前的工作流程。
    特别是 complete需要知道 输入数据中所有可能的值 为了创建缺失的行,这意味着这个操作 整体不能拆分,这就是为什么没有适用的方法可用。
    在您提供的示例中,每个节点都会收到一个 var_1, var_2在不知道其他节点得到什么的情况下配对,这不允许并行实现预期结果。
    但是,正如您已经知道的那样 year = seq(min_year,max_year) ,您可以并行化 complete仅用于此变量的任务,按 var_1 拆分任务,例如 furrr包:
    library(furrr)
    plan(multiprocess)
    test_parallel <- test %>%
    group_by(var_1,var_2) %>%
    complete(var_1) %>% split(.$var_1) %>%
    furrr::future_map(~{
    complete(.x, year = seq(min_year,max_year)) %>%
    dplyr::mutate(
    var_3 = na.approx(var_3,na.rm = FALSE),
    var_3 = if(all(is.na(var_3))) NA else na.spline(var_3,na.rm = FALSE))
    }) %>% bind_rows()

    > identical(c(test_serial$var_1,test_serial$var_2,test_serial$var_3,test_serial$year),
    + c(test_parallel$var_1,test_parallel$var_2,test_parallel$var_3,test_parallel$year))
    [1] TRUE
    在更大的数据集上进行测试以衡量潜力 performance改进。

    关于r - 并行计算,dplyr 中 tidyr::complete 的替代方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62553822/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com