4

Address、City、State、Zip エンティティを含むデータフレームがあります。そこから、Yahoo API を使用して各住所をジオコーディングしようとしています。

これは、O'Reilly の Data Mashups using R Tutorial のコードに基づいています。元の例では、番地のベクトルを取得し、ハードコーディングされた都市を使用しています。複数の都市をサポートする動的な例を作成しようとしています。

コードの短縮版は次のとおりです。

    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 をループする以外に、行ごとに 1 回だけ Yahoo API を呼び出し、メンバーごとに経度/緯度の両方を保存する方法がわかりません。

4

2 に答える 2

6

myStreetsが data.frameの場合、forループはその各列を取得します。したがって、最初のステップは Address を使用し、Address$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)
}
于 2009-09-28T22:41:25.357 に答える
4

そんなことするなら公の場では言わない。それは彼らの利用規約に反しています。代わりにUSC webgisを使用することをお勧めします。数か月前、私は約 50 万件のレコードをほとんど問題なくジオコーディングしました。

于 2009-09-29T03:22:31.797 に答える