【问题标题】:Trying to loop through a dataframe and reference multiple fields尝试遍历数据框并引用多个字段
【发布时间】:2010-12-02 03:36:30
【问题描述】:

我有一个包含地址、城市、州、邮编实体的数据框。从那里开始,我尝试使用 Yahoo API 对每个地址进行地理编码。

我基于 O'Reilly 的使用 R 教程的数据混搭中的代码。原始示例采用街道地址向量并使用硬编码的城市。我正在尝试制作一个支持多个城市的动态示例。

代码的缩写版本是:

    geocodeAddresses<-function(myStreets)
    }
  appid<-'<put your appid here>'
          baseURL<-"http://local.yahooapis.com/MapsService/V1/geocode?appid="
          myGeoTable<-data.frame(address=character(),lat=numeric(),long=numeric(),EID=numeric())
          for (myStreet in myStreets){  
            requestUrl<-paste(baseURL, appid, "&street=", URLencode(myStreet$address),"&city=",URLencode(myStreet$city),"&state=",URLencode(myStreet$state),sep="")
            xmlResult<-xmlTreeParse(requestUrl,isURL=TRUE,addAttributeNamespaces=TRUE)
            geoResult<-xmlResult$doc$children$ResultSet$children$Result
            lat<-xmlValue(geoResult[['Latitude']])
            long<-xmlValue(geoResult[['Longitude']])
            myGeoTable<-rbind(myGeoTable,data.frame(address=myStreet,Y=lat,X=long,EID=NA))
          }
    }

当我尝试引用 myStreet$City 和 myStreet$Address 时,我收到一个错误

$ operator is invalid for atomic vectors

除了循环遍历数据框 myStreets 之外,我不知道如何才能为每行仅调用一次 Yahoo API 并存储每个成员的 long/lat。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    如果myStreets 是data.frame,那么for 循环将获取它的每一列。所以第一步需要 Addres 和 Addres$City 没有意义。

    您可以更改 for 条件以循环遍历行:

    for (i in 1:nrow(myStreets))  {
       myStreet <- myStreets[i,]
       # rest is the same
    }
    

    要优化您的代码,您还可以执行以下操作:

    myGeoTable <- data.frame( address=myStreet$address, lat=NA_real_, long=NA_real_, EID=NA_real_)
    for (i in 1:nrow(myStreets))  {
      myStreet <- myStreets[i,] 
      requestUrl <- ...
      ...
      myGeoTable[i,2:4] <- c(lat,long,NA)
    }
    

    【讨论】:

    • 小心1:nrow 语法。如果 myStreet 中没有行,那么将生成1 0 的序列。使用seq_len(nrow(myStreets))更安全
    【解决方案2】:

    如果你要这样做,我不会公开谈论它。这违反了他们的服务条款。我建议改用USC webgis。几个月前,我对大约 50 万条记录进行了地理编码,没有出现太多问题。

    【讨论】:

    • 我得好好检查一下 TOS。我认为由于 O'Reilly 在教程中使用了它,而且我们只有 5k/24 小时的时间,所以这是公平的游戏。感谢您的提醒。我一定会看看 USC webgis。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2020-09-23
    相关资源
    最近更新 更多