Cercando di scorrere un dataframe e di riferimento più campi
Domanda
Ho un dataframe con indirizzo, città, stato, enti Zip. Da lì, sto cercando di utilizzare le API di Yahoo il geocoding ogni indirizzo.
sto basando questa via il codice di dati mashup di O'Reilly usando R Tutorial. L'esempio originale prende un vettore di indirizzi stradali e utilizza una città hard-coded. Sto cercando di fare un esempio dinamico che supporta più le città.
La versione abbreviata del codice è:
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))
}
}
Quando provo e riferimento myStreet $ City e myStreet $ Indirizzo, ricevo un errore
$ operator is invalid for atomic vectors
Oltre scorrendo myStreets struttura dati, non so come posso fare la chiamata alla API Yahoo sola volta per ogni riga e immagazzinare lungo / LAT per ciascun utente.
Soluzione
Se myStreets
è data.frame ciclo quindi for
prende ogni colonna di esso. Quindi primo passo prende Addres e Addres $ Città non ha senso.
Si potrebbe cambiare condizione for
al ciclo sopra le righe:
for (i in 1:nrow(myStreets)) {
myStreet <- myStreets[i,]
# rest is the same
}
Per ottimizzato il codice è possibile anche fare qualcosa di simile:
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)
}
Altri suggerimenti
Se avete intenzione di fare questo, non vorrei parlarne in pubblico. E 'contro i loro termini di servizio. Io suggerirei di utilizzare USC WebGIS . Un paio di mesi fa ho geocoding circa mezzo milione di record senza troppi problemi.