데이터 프레임을 통과하고 여러 필드를 참조하려고합니다.

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

  •  18-09-2019
  •  | 
  •  

문제

주소, 도시, 주, 지퍼 엔티티가있는 데이터 프레임이 있습니다. 거기에서 나는 야후 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 $ City 및 MyStreet $ 주소를 참조하려고하면 오류가 발생합니다.

$ operator is invalid for atomic vectors

데이터 프레임 MyStreets를 통한 루핑 이외에, 나는 각 행에 대해 Yahoo API를 호출 할 수있는 방법을 모르고 각 멤버의 Long/LAT를 모두 저장합니다.

도움이 되었습니까?

해결책

만약에 myStreets 그렇다면 data.frame입니다 for 루프는 각 열을 가져옵니다. 따라서 첫 번째 단계는 Addres를 취하고 Addres $ 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 Webgis 대신에. 몇 달 전에 나는 너무 많은 문제없이 약 50 만 개의 기록을 지구 코딩했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top