2017-07-06 76 views
1

我希望在美國某個州的所有氣象站點上從01/01/1981到2016年12月31日以CSV格式下載每日摘要數據;但是,這大大超過了可以一次手動下載的數據限制。我希望數據以公制爲單位,包括電臺名稱和地理位置。如何使用R通過FTP鏈接從NOAA下載每日摘要數據?

是否可以通過FTP鏈接使用R下載此數據?如果是這樣,任何人都可以解釋如何做到這一點,或指出我在正確的方向?

任何幫助將不勝感激!

+0

你有鏈接到NOAA的FTP站點嗎?可以創建一個鏈接列表並使用download.file()函數,或者如果您喜歡命令行方法,則可以使用system()命令。假設你不需要特殊的密碼權限,它應該相對簡單。 – elmuertefurioso

+0

感謝您的建議,並抱歉響應緩慢。我認爲這是到FTP的鏈接:ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/daily/。我將看看download.file()函數。 – Powege

回答

0

假設ftp設置遵循標準化格式(給定其NOAA和縱向,我認爲這是一個安全的假設),您可以使用許多迭代器之一來製作url列表和調用download.file()拉普利或地圖。以下是我用地圖調用人口普查LEHD數據的一些示例代碼。不幸的是,它不是一個使用你的數據的直接例子,因爲我不能讓鏈接工作,所以你必須修改一下。但基本的邏輯是你可以找到URL的哪些部分發生變化,使這些部分變量並提供你需要的值,然後調用。這相對簡單。在這種情況下,變化的主要變量是州縮寫和年份。因爲我只需要兩年時間,我可以直接輸入這些內容,但是我使用底格里斯軟件包來獲取獨特的州名縮寫。

if(!require(pacman)){install.packages("pacman"); library(pacman)} 
p_load(tigris,purrr, dplyr) 
#calls tigris "state" df to get unique state FIPS codes 
us_states <- tolower(unique(fips_codes$state)[1:51]) 

year <- c(2004, 2014) 

get_lehd <- function(states, year) { 
    #grabbing all private jobs WAC 
    lehd_url <- paste0("https://lehd.ces.census.gov/data/lodes/LODES7/", 
states,"/wac/", states,"_wac_S000_JT02_",year,".csv.gz") 
    filenames <- paste0(states,"_", year,".csv.gz") 
    download.file(lehd_url, dest = filenames) 
} 
#use possibly so if it kicks an error it keeps going 
possible_get_lehd <- possibly(get_lehd, otherwise = NA) 
#download the files to current wd 
map(us_states, possible_get_lehd,year = 2004) 
map(us_states, possible_get_lehd,year = 2014)