Essayer de boucle à travers un plusieurs champs de trame de données et de référence

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

  •  18-09-2019
  •  | 
  •  

Question

J'ai un dataframe avec adresse, ville, État, des entités Zip. À partir de là, je suis en train d'utiliser les API de Yahoo géocodage chaque adresse.

Je fonde ce hors le code dans les mashups données O'Reilly en utilisant R Tutorial. L'exemple d'origine prend un vecteur d'adresses de la rue et utilise une ville codée en dur. Je suis en train de faire un exemple dynamique qui prend en charge plusieurs villes.

La version abrégée du code est:

    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))
          }
    }

Quand je tente de référence myStreet $ Ville et myStreet Adresse $, je reçois une erreur

$ operator is invalid for atomic vectors

Autre que bouclage myStreets de trames de données, je ne sais pas comment je peux faire appel à l'API Yahoo une seule fois pour chaque ligne et stocker à la fois la latitude / longitude pour chaque membre.

Était-ce utile?

La solution

Si myStreets est data.frame boucle puis for prend chaque colonne de celui-ci. Donc, la première étape prend Addres et Addres $ Ville n'a pas de sens.

Vous pouvez changer l'état de for en boucle sur les lignes:

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

Pour optimiser votre code, vous pouvez aussi faire quelque chose comme:

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)
}

Autres conseils

Si vous allez faire ceci, je ne parlerais pas en public. Il est contre leurs conditions de service. Je suggère d'utiliser USC WEBGIS place. Quelques mois je géocodées environ la moitié d'un million de dossiers sans trop de problèmes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top