2016-12-16 74 views
2

新成員在這裏。試圖從R的網站下載大量的文件(但也開放給建議,如wget)。下載R中可變長度,嵌套URL的多個文件

this post,我知道我必須創建一個帶有所需URL的向量。我最初的問題是編寫這個向量,因爲我在每個州有27個州和34個機構。我必須爲所有州的每個機構下載一個文件。州代碼總是兩個字符,代理機構代碼長度爲2到7個字符。該網址應該是這樣的:

http://website.gov/xx_yyyyyyy.zip 

其中xx是國家代碼和yyyyyyy機構代碼,2首7個字符之間。我失去了如何建立一個這樣的循環。

我想那我可以下載這個URL列表具有以下功能:

for(i in 1:length(url)){ 
download.file(urls, destinations, mode="wb")} 

這是否有意義?

(免責聲明:這篇文章的早期版本較早,但不完整的上傳我的錯,對不起!)

+1

這個簡單的例子可以幫助'paste0(rep(letters [1:4],4),rep(1:4,each = 4))''。如果沒有關於機構名稱的更多信息,就不可能說更多。 – lmo

+0

感謝您的輸入。機構名稱是首字母縮略詞:FAA,DEA,NTSB等。我用這些首字母縮略詞創建了一個矢量「代理」,還有一個有我需要的27個州的「州」矢量。將嘗試您的建議併發回。 – questionMarc

+0

謝謝,@Imo!你的意見幫助了我很多。現在我明白添加字符串變量的動態。 – questionMarc

回答

5

這將下載他們分批走的download.file()的更快同時下載功能的優勢,如果libcurl選項可用上安裝的R:

library(purrr) 

states <- state.abb[1:27] 
agencies <- c("AID", "AMBC", "AMTRAK", "APHIS", "ATF", "BBG", "DOJ", "DOT", 
       "BIA", "BLM", "BOP", "CBFO", "CBP", "CCR", "CEQ", "CFTC", "CIA", 
       "CIS", "CMS", "CNS", "CO", "CPSC", "CRIM", "CRT", "CSB", "CSOSA", 
       "DA", "DEA", "DHS", "DIA", "DNFSB", "DOC", "DOD", "DOE", "DOI") 

walk(states, function(x) { 
    map(x, ~sprintf("http://website.gov/%s_%s.zip", ., agencies)) %>% 
    flatten_chr() -> urls 
    download.file(urls, basename(urls), method="libcurl") 
}) 
+0

這是一個非常優雅的解決方案,@ hrbrmstr。感謝您的意見。我會測試它併發回。 – questionMarc

+1

你的腳本完美無缺 - 是我見過的最快的下載。非常感謝! – questionMarc

1

這應該做的工作:

agency <- c("FAA", "DEA", "NTSB") 
states <- c("AL", "AK", "AZ", "AR") 

URLs <- 
paste0("http://website.gov/", 
     rep(agency, length(agency)), 
     "_", 
     rep(states, length(states)), 
     ".zip") 

然後遍歷URLs矢量拉zip文件。如果使用apply函數,速度會更快。

+1

這個工作,但只是因爲代理和國家的長度是相對主要的。爲了使它更通用,其中一個rep命令應該指定'each',另一個應該指定'times'。在這種情況下,「申請」會不會更快? – Miff

+0

謝謝,@ epo3。它工作完美。現在我想我可以使用'download.file()'並循環遍歷所有的url。再次感謝! – questionMarc

+0

@Miff:我想我需要爲每個國家指定一個「時間」和「每個」機構27次? – questionMarc

0

如果所有機構代碼中的每個相同你可以使用下面的代碼創建你的urls向量來循環。 (你還需要一個相同大小的目標向量)。

#Getting all combinations 
States <- c("AA","BB") 
Agency <- c("ABCDEFG","HIJKLMN") 
AllCombinations <- expand.grid(States, Agency) 
AllCombinationsVec <- paste0("http://website.gov/" ,AllCombinations$Var1, "_",AllCombinations$Var2,".zip") 

然後,您可以嘗試通過每個文件是這樣的循環:

#loop method 

for(i in seq(AllCombinationsVec)){ 
    download.file(AllCombinationsVec[i], destinations[i], mode="wb")} 

這也是通過項目循環的另一種方式適用的功能將函數應用到每一個項目列表或載體。

#lapply method 

mapply(function(x, y) download.file(x,y, mode="wb"),x = AllCombinationsVec, y = destinations) 
+0

謝謝你的建議。它也起作用了! – questionMarc