【问题标题】:Is it possible to parallelize the geocode function from the tidygeocoder package in R?是否可以并行化 R 中 tidygeocoder 包中的地理编码功能?
【发布时间】:2022-06-23 19:27:37
【问题描述】:

我正在尝试对 R 中的几个地址进行地理编码。我正在使用 R 中的 tidygeocoder 包中的地理编码函数。为了使其更快,我很想并行化这个函数,但我不知道这可能工作。

我在 Windows 上工作。

这是一个例子:

id street state county
1 123 happiness TT South
2 234 parallel HH North
# create cluster
cl <- parallel::makeCluster(8, type = "PSOCK")

# geocode the addresses
latlon <- parallel::parLapply(cl=cl, geocode, .tbl = address_df, method = 'osm', lat = latitude , long = longitude, address = NULL, street = street, county = county, state = state)

street 应该是列表(是 的一列)我正在尝试运行 parLapply 函数并对函数进行地理编码。地理编码功能不允许我使用矢量作为地址。我已经使用地理编码、街道、县和州的所有选项来获取它们的纬度和经度。

这个函数可以并行化吗?

【问题讨论】:

    标签: r parallel-processing


    【解决方案1】:

    原始数据扩展

    我通过一个真实的例子扩展了address_df

    address_df <- data.frame(id = c(1, 2, 3),
                             street = c("123 happiness", "234 parallel", "60 E Broadway"),
                             state =  c("TT", "HH", "MN"),
                             county = c("South", "North", "Hennepin"))
    

    包和目的

    对于迭代,我通常喜欢使用 purrr 包 (https://purrr.tidyverse.org/),对于并行化,我建议使用它的扩展包,furrr 包 (https://furrr.futureverse.org/)。

    library(tidyverse) # includes purrr package
    library(tidygeocoder)
    # install.packages("furrr") # will also install `future`package
    library(furrr)  # will also load `future`package
    

    数据准备

    geocode() 函数旁边还有geo() 函数,它只需要一个逗号分隔的字符串和一个组合地址作为参数,这对于迭代更可取,而不是.tbl 和参数@987654333 @、statecounty 我们只需要传递一个逗号分隔的地址字符串。

    address_df <- address_df %>% 
      mutate(address = paste(street, state, county, sep = ", "))
    

    furrr 中的迭代需要一个列表:

    address_list <- address_df$address %>%
      as.list()
    

    address_list 现在包含每个逗号分隔地址字符串的列表元素。

    并行化准备

    future 包中的plan() 函数(与furrr 包一起安装并加载)定义了您要在并行化上工作的内核数,我通常选择availableCores() - 1

    plan(strategy = "multisession", workers = availableCores() - 1)
    

    并行迭代

    address_geodata <- future_map(.x = address_list, 
                                  ~ geo(address = .x, method = 'osm', lat = latitude , long = longitude)) %>% 
      # puts the lists back together into a dataframe/tibble
      bind_rows()
    

    加入原始数据和地理数据

    address_df_geo <- address_df %>% 
                      left_join(address_geodata, by = "address")
    

    address_df_geo

    【讨论】:

      猜你喜欢
      • 2021-11-20
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多