簡體   English   中英

嘗試遍歷數據框並引用多個字段

[英]Trying to loop through a dataframe and reference multiple fields

我有一個包含Address,City,State,Zip實體的數據框。 從那里開始,我正在嘗試使用Yahoo API對每個地址進行地理編碼。

我使用R Tutorial在O'Reilly的Data Mashups代碼中做了這個。 原始示例采用街道地址向量並使用硬編碼城市。 我正在嘗試制作一個支持多個城市的動態示例。

代碼的縮寫版本是:

    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,並為每個成員存儲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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM