データフレームと参照複数のフィールドをループしようと

StackOverflow https://stackoverflow.com/questions/1489526

  •  18-09-2019
  •  | 
  •  

質問

私は住所、市、州、郵便番号のエンティティとデータフレームを持っています。そこから、私はそれぞれの住所をジオコードするためにYahooのAPIを使用しようとしています。

私はRのチュートリアルを使用してO'Reillyのデータマッシュアップのコードを、これをオフに基づかよ。元の例では、住所のベクトルをとり、ハードコードされた都市を使用します。私は複数の都市をサポートダイナミック例を作成しようとしています。

コードの簡略バージョンである

    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 $市とmyStreetの$住所は、私はエラーを受け取った場合、

$ operator is invalid for atomic vectors

データフレームmyStreetsをループ以外に、私は行ごとに一度だけのYahooのAPIへの呼び出しを行うと、各メンバーのための長い/緯度の両方を保存することができますかわからない。

役に立ちましたか?

解決

myStreetsはdata.frameその後、forループがある場合は、それの各列を取ります。だから、最初のステップは意味をなさないADDRESとADDRES $市かかります。

あなたが行をループに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)
}

他のヒント

あなたがこれをやろうとしている場合は、

、私は公共の場でそれについて話しません。これは、サービスの任期に対してです。私は USCはなくの型WebGIS使用をお勧めしたいです。数ヶ月前、私はあまりにも多くの問題もなく約半分万レコードをジオコードます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top