【问题标题】:R - Applying formula through partitioning a datasetR - 通过分区数据集应用公式
【发布时间】:2023-04-02 21:57:02
【问题描述】:

我需要使用 Bing 地图 API 来获取密码列表(印度)的坐标数据。我可以使用代码对小型数据集执行此操作:

get_lat_long <- function(pincodes) {
  # key: https://www.bingmapsportal.com/Application
  require(XML); require(data.table)
  PinCodeLatLong <- data.frame(pincode = "Temp", lat = "Lat", long = "Long")
  for(i in 1:length(pincodes)){ 
    var = pincodes[i] 
    link=paste0("http://dev.virtualearth.net/REST/v1/Locations?postalCode=",var,"&o=xml&maxResults=1&key=<mykey>") 
    #data<- xmlParse(link) 
    xml_data <- xmlToList(xmlParse(link)) 
    PinCodeLatLongtemp <- data.frame(pincode = "Temp", lat = "Lat", long = "Long") 
    PinCodeLatLongtemp$pincode <- var
    PinCodeLatLongtemp$lat <- xml_data$ResourceSets$ResourceSet$Resources$Location$Point$Latitude 
    PinCodeLatLongtemp$long <- xml_data$ResourceSets$ResourceSet$Resources$Location$Point$Longitude 
    PinCodeLatLong <- rbindlist(list(PinCodeLatLongtemp,PinCodeLatLong), fill = T) 
  }
  return(PinCodeLatLong)
}
master_lat_long <- get_lat_long(pincode_map$Pincode)
master_lat_long <- dplyr::filter(master_lat_long, !is.na(pincode))
master_lat_long <- master_lat_long[!duplicated(master_lat_long),]
pincode_map <- merge(pincode_map, master_lat_long, by.x="Pincode", by.y="pincode", all.y=FALSE)

但是,Bing Maps Basic API 一次只允许 2500 个数据点,我需要为大型数据集(100,000+)执行此操作。将公式分区并将其应用于文件 master_lat_long 的最佳方法是什么?有没有办法自动做到这一点?

【问题讨论】:

    标签: r bing-maps geo data-partitioning


    【解决方案1】:

    有多种方法可以为每 2500 个值拆分数据。

    ceiling 的一种方法是:

    result <- by(pincode_map$Pincode, 
                 ceiling(seq_len(nrow(pincode_map))/2500), get_lat_long)
    

    【讨论】:

    • Error in tapply(seq_len(19144L), list(`ceiling(seq_len(nrow(pincode_map)/2500))` = c(1, : arguments must have same length 在尝试使用 19144 行数据集时遇到此错误
    • 抱歉,我之前的代码中有错字。可以试试更新后的代码吗?
    • 它现在正在工作。但是,仍然无法让 Maps API 正常工作(仍然会引发相同的 HTTP 资源错误)。明天我将不得不再次查看它,因为现在每天的配额可能已经结束了。
    • 我不知道get_lat_long 函数的作用以及它应该如何工作。我的代码将Pincode 分成2500 个块并将其传递给get_lat_long。如果get_lat_long 适用于任何 10 个左右的值,那么上面的代码也应该可以工作。
    • 它正在工作,但我仍然收到一些错误(某些密码没有可用的数据)。我需要在那里获取一些错误处理代码。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2016-09-05
    相关资源
    最近更新 更多