Попытка перебирать фрейм данных и ссылаться на несколько полей

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

  •  18-09-2019
  •  | 
  •  

Вопрос

У меня есть фрейм данных с объектами Address, City, State, Zip.Оттуда я пытаюсь использовать API Yahoo для геокодирования каждого адреса.

Я основываю это на коде из мэшапов данных О'Рейли с использованием 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 фрейма данных, я не знаю, как я могу вызвать Yahoo API только один раз для каждой строки и сохранить длину / широту для каждого элемента.

Это было полезно?

Решение

Если myStreets является data.frame, то for цикл занимает каждый его столбец.Итак, первый шаг требует адреса, а адрес $ 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)
}

Другие советы

Если ты собираешься это сделать, я бы не стал говорить об этом публично.Это противоречит их условиям предоставления услуг.Я бы предложил использовать Вебгис USC вместо этого.Пару месяцев назад я геокодировал около полумиллиона записей без особых проблем.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top