2016-04-04 4 views
1

Я пытаюсь построить dataframe с некоторым бразильским адресом, обратившись к веб-службе и отыскивая почтовый индекс. На самом деле, я могу получить один единственный результат и сохранить его в фреймворке данных, но когда я пытаюсь выполнить поиск нескольких почтовых индексов (например, в векторе), мой dataframe сохраняет только последний элемент. Может ли кто-нибудь помочь мне, пожалуйста?R. Как добавить результаты цикла (for) в структуру данных?

Смотрите код ниже:

############### 
library(httr) 
library(RCurl) 
library(XML) 
library(dplyr) 
############### 

# ZIPs I want to search for: 
vectorzip <- c("71938360", "70673052", "71020510") 
j <- length(vectorzip) 

# loop: 
for(i in 1:j) { 

# Save the URL of the xml file in a variable: 
xml.url <- getURL(paste("http://cep.republicavirtual.com.br/web_cep.php?cep=",vectorzip[i], sep = ""), encoding = "ISO-8859-1") 
xml.url 

# Use the xmlTreeParse-function to parse xml file directly from the web: 
xmlfile <- xmlTreeParse(xml.url) 
xmlfile 
# the xml file is now saved as an object you can easily work with in R: 
class(xmlfile) 

# Use the xmlRoot-function to access the top node: 
xmltop = xmlRoot(xmlfile) 

# have a look at the XML-code of the first subnodes: 
print(xmltop) 

# To extract the XML-values from the document, use xmlSApply: 
zips <- xmlSApply(xmlfile, function(x) xmlSApply(x, xmlValue)) 
zips 
# Finally, get the data in a data-frame and have a look at the first rows and columns: 
zips <- NULL 
zips <- rbind(zips_df, data.frame(t(zips),row.names=NULL)) 

View(zips_df)} 
+1

Что такое молния <- NULL строка для Где указано zips_df? –

+0

Как правило, не рекомендуется выращивать объект с помощью rbind. Лучшим способом является определение пустого массива данных определенного размера (таким образом, выделение необходимой памяти) и последующего заполнения строк. – RHertel

ответ

0

Вы хотите:

а) определить zips_df
б) определяют zips_df вне цикла.
с) не установить zips_df обнулить внутри цикла :)

############### 
library(httr) 
library(RCurl) 
library(XML) 
library(dplyr) 
############### 

# ZIPs I want to search for: 
vectorzip <- c("71938360", "70673052", "71020510") 
j <- length(vectorzip) 
zips_df <- data.frame() 

i<-1 
# loop: 
for(i in 1:j) { 

    # Save the URL of the xml file in a variable: 
    xml.url <- getURL(paste("http://cep.republicavirtual.com.br/web_cep.php?cep=",vectorzip[i], sep = ""), encoding = "ISO-8859-1") 
    xml.url 

    # Use the xmlTreeParse-function to parse xml file directly from the web: 
    xmlfile <- xmlTreeParse(xml.url) 
    xmlfile 
    # the xml file is now saved as an object you can easily work with in R: 
    class(xmlfile) 

    # Use the xmlRoot-function to access the top node: 
    xmltop = xmlRoot(xmlfile) 

    # have a look at the XML-code of the first subnodes: 
    print(xmltop) 

    # To extract the XML-values from the document, use xmlSApply: 
    zips <- xmlSApply(xmlfile, function(x) xmlSApply(x, xmlValue)) 
    zips 
    # Finally, get the data in a data-frame and have a look at the first rows and columns: 

    zips_df <- rbind(zips_df, data.frame(t(zips),row.names=NULL)) 
} 

    View(zips_df) 

Вы получаете это:

> zips_df 
    resultado.text  resultado_txt.text uf.text cidade.text   bairro.text tipo_logradouro.text logradouro.text 
1    1 sucesso - cep completo  DF Taguatinga Sul (Ãguas Claras)     Rua    09 
2    1 sucesso - cep completo  DF Cruzeiro  Setor Sudoeste    Quadra  300 Bloco O 
3    1 sucesso - cep completo  DF  Guará   Guará I    Quadra QI 11 Conjunto U 
+0

Спасибо, Сербан! –

0

Пожалуйста, попробуйте представить рабочий пример минимальной. В вашем примере есть тонны строк кода, которые не связаны с вашей реальной проблемой. И если вы попытаетесь удалить этот ненужный код, вы, вероятно, заметили бы строку zips <- NULL, которая удаляет информацию об zip-файлах непосредственно перед ее сохранением. Во-вторых, вы ссылаетесь на объект zips_df, но это не создается в вашем коде.

Чтобы ответить на ваш вопрос:

  • Добавить строку создавая zips_df как пустой объект dataframe перед началом цикла:

    vectorzip <- c("71938360", "70673052", "71020510") 
    j <- length(vectorzip) 
    zips_df <- data.frame() 
    
  • Удалить строку, где вы удалите zips объект (zips <- NULL)

  • Изменить линию, в которой вы выращиваете zips_df d ata.frame сохранить полные данные к объекту data.frame, а не временный «молнии» переменная:

    zips <- rbind(zips_df, data.frame(t(zips),row.names=NULL)) 
    

Я также рекомендую удалить строку «View» и осмотр data.frame с печатью :

print(zips_df) 
resultado.text  resultado_txt.text uf.text cidade.text    bairro.text tipo_logradouro.text logradouro.text 
1    1 sucesso - cep completo  DF Taguatinga Sul (Ã\u0081guas Claras)     Rua    09 
2    1 sucesso - cep completo  DF Cruzeiro   Setor Sudoeste    Quadra  300 Bloco O 
3    1 sucesso - cep completo  DF  Guará     Guará I    Quadra QI 11 Conjunto U 
+0

Большое спасибо Андре. Я ценю вашу рекомендацию и ваш ответ! –

Смежные вопросы