我正在尝试使用USGS软件包dataRetrieval
提取给定日期范围内具有每日平均水温的所有美国地质调查局(USGS)站点。我可以用for循环迭代每个美国州/地区的缩写,但是循环一旦遇到没有任何站点的位置就会停止运行。如何使没有可用站点的循环跳过位置?
这是for循环,但是当它遇到一个没有站点的州/地区时就会停止。
library(dataRetrieval)
statCd <- "00003" # Mean
startDate <- "1990-01-01"
endDate <- "2019-12-31"
states <- stateCd
# For loop determines how many sites have daily avg. water temp. data records for period of interest
for(i in 1:length(states)) {
tempDat_states = whatNWISdata(stateCd = states[i],
parameterCd = "00010") # Water temperature
temp_states = tempDat_states %>%
filter(stat_cd == "00003") %>%
mutate(period = as.Date(endDate) - as.Date(startDate))
temp_states$end_year <- year(temp_states$end_date)
temp_states$start_year <- year(temp_states$begin_date)
temp_states <- temp_states[temp_states$start_year <= 1990 & temp_states$end_year >= 2019,]
curDat_temp = temp_states
curDat_temp$STUSAB = states[i]
if( i == 1){
saveDat_temp = curDat_temp
} else{
saveDat_temp = rbind(saveDat_temp, curDat_temp)
}
}
下面的for循环与上面的相同,但我手动只保留了有站点可用的州/地区。我想避免手动识别和保留这些州/地区,所以在for循环中跳过这些位置的任何代码(可能使用next
?)将是我正在寻找的。
# Remove AR, DO, HI, ID, IA, MA, NE, NH, OK, RI, SD, VT, AS, GU, MP, PR, UM, VI for having zero sites
states <- stateCd[c(1:3,5:8,10:11,14:15,17:21,23:27,29,31:36,38:39,41,43:45,47:51),2]
for(i in 1:length(states)) {
tempDat_states = whatNWISdata(stateCd = states[i],
parameterCd = "00010") # Water temperature
temp_states = tempDat_states %>%
filter(stat_cd == "00003") %>%
mutate(period = as.Date(endDate) - as.Date(startDate))
temp_states$end_year <- year(temp_states$end_date)
temp_states$start_year <- year(temp_states$begin_date)
temp_states <- temp_states[temp_states$start_year <= 1990 & temp_states$end_year >= 2019,]
curDat_temp = temp_states
curDat_temp$STUSAB = states[i]
if( i == 1){
saveDat_temp = curDat_temp
} else{
saveDat_temp = rbind(saveDat_temp, curDat_temp)
}
}
不要在for
循环中生长对象。定义一个列表,并在每次迭代中填充它。试一试:
library(dataRetrieval)
library(dplyr)
statCd <- "00003"
startDate <- "1990-01-01"
endDate <- "2019-12-31"
states <- stateCd
result <- vector('list', nrow(states))
for(i in 1:nrow(states)) {
print(i)
tempDat_states = whatNWISdata(stateCd = states$STUSAB[i],parameterCd = "00010")
temp_states = tempDat_states %>%
filter(stat_cd == "00003") %>%
mutate(period = as.Date(endDate) - as.Date(startDate))
temp_states$end_year <- year(temp_states$end_date)
temp_states$start_year <- year(temp_states$begin_date)
temp_states <- temp_states[temp_states$start_year <= 1990 & temp_states$end_year >= 2019,]
result[[i]] <- temp_states
}
full_data <- do.call(rbind.data.frame, result)
这里是一个使用lapply()
代替for
循环的方法。
library(dataRetrieval)
library(dplyr)
library(magrittr)
statCd <- "00003" # Mean
startDate <- "1990-01-01"
endDate <- "2019-12-31"
states <- setdiff(stateCd$STUSAB, "UM")
saveDat <- lapply(
states,
function(st) {
cat("Retrieve data for:", st, "n")
whatNWISdata(
stateCd = st,
parameterCd = "00010" # Water temperature
) %>%
filter(stat_cd == statCd & begin_date >= startDate & end_date <= endDate) %T>%
{cat(st, ":", nrow(.), "rows after filteringn")}
}) %>%
set_names(states)
返回一个命名列表,其中包含来自每个状态的数据(每个列表元素一个data.frame)。
由于下载需要相当长的时间,对cat()
的调用通知每个状态的进度和成功:
Retrieve data for: AL AL : 1 rows after filtering Retrieve data for: AK |========================================================================================| 100% 27 MB AK : 47 rows after filtering Retrieve data for: AZ |========================================================================================| 100% 60 MB |========================================================================================| 100% 60 MB AZ : 3 rows after filtering Retrieve data for: AR |========================================================================================| 100% 34 MB AR : 8 rows after filtering Retrieve data for: CA |=======================================================================================| 100% 264 MB |=======================================================================================| 100% 264 MB |=======================================================================================| 100% 264 MB CA : 20 rows after filtering Retrieve data for: CO CO : 19 rows after filtering Retrieve data for: CT |========================================================================================| 100% 23 MB CT : 18 rows after filtering Retrieve data for: DE DE : 4 rows after filtering Retrieve data for: DC DC : 6 rows after filtering Retrieve data for: FL |=======================================================================================| 100% 107 MB FL : 76 rows after filtering Retrieve data for: GA GA : 39 rows after filtering Retrieve data for: HI HI : 99 rows after filtering Retrieve data for: ID |========================================================================================| 100% 83 MB ID : 76 rows after filtering Retrieve data for: IL IL : 25 rows after filtering Retrieve data for: IN |========================================================================================| 100% 44 MB IN : 9 rows after filtering Retrieve data for: IA |========================================================================================| 100% 70 MB IA : 17 rows after filtering Retrieve data for: KS |========================================================================================| 100% 67 MB KS : 47 rows after filtering Retrieve data for: KY KY : 32 rows after filtering Retrieve data for: LA |========================================================================================| 100% 53 MB LA : 29 rows after filtering Retrieve data for: ME ME : 16 rows after filtering Retrieve data for: MD |========================================================================================| 100% 43 MB MD : 22 rows after filtering Retrieve data for: MA MA : 4 rows after filtering Retrieve data for: MI |========================================================================================| 100% 42 MB MI : 41 rows after filtering Retrieve data for: MN MN : 147 rows after filtering Retrieve data for: MS MS : 9 rows after filtering Retrieve data for: MO MO : 21 rows after filtering Retrieve data for: MT MT : 38 rows after filtering Retrieve data for: NE NE : 32 rows after filtering Retrieve data for: NV |========================================================================================| 100% 50 MB NV : 41 rows after filtering Retrieve data for: NH NH : 4 rows after filtering Retrieve data for: NJ |========================================================================================| 100% 93 MB NJ : 68 rows after filtering Retrieve data for: NM |========================================================================================| 100% 59 MB |========================================================================================| 100% 59 MB NM : 11 rows after filtering Retrieve data for: NY |=======================================================================================| 100% 128 MB |=======================================================================================| 100% 128 MB NY : 34 rows after filtering Retrieve data for: NC |========================================================================================| 100% 47 MB NC : 108 rows after filtering Retrieve data for: ND ND : 16 rows after filtering Retrieve data for: OH OH : 10 rows after filtering Retrieve data for: OK OK : 26 rows after filtering Retrieve data for: OR |========================================================================================| 100% 32 MB OR : 122 rows after filtering Retrieve data for: PA |=======================================================================================| 100% 108 MB PA : 91 rows after filtering Retrieve data for: RI RI : 0 rows after filtering Retrieve data for: SC SC : 47 rows after filtering Retrieve data for: SD SD : 10 rows after filtering Retrieve data for: TN TN : 16 rows after filtering Retrieve data for: TX |========================================================================================| 100% 99 MB |========================================================================================| 100% 99 MB TX : 120 rows after filtering Retrieve data for: UT UT : 15 rows after filtering Retrieve data for: VT VT : 3 rows after filtering Retrieve data for: VA |========================================================================================| 100% 34 MB VA : 86 rows after filtering Retrieve data for: WA |========================================================================================| 100% 84 MB WA : 57 rows after filtering Retrieve data for: WV WV : 13 rows after filtering Retrieve data for: WI WI : 70 rows after filtering Retrieve data for: WY |========================================================================================| 100% 53 MB WY : 24 rows after filtering Retrieve data for: AS AS : 0 rows after filtering Retrieve data for: GU GU : 0 rows after filtering Retrieve data for: MP MP : 0 rows after filtering Retrieve data for: PR PR : 0 rows after filtering Retrieve data for: VI VI : 0 rows after filtering
UM
从状态缩写向量中删除,因为whatNWISdata()
在调用stateCd = "UM"
时发生错误。
saveDat
是一个包含56个元素的大列表,但是OP期望一个data.frame结合结果。
不幸的是,whatNWISdata()
返回的data.frames并不总是一致的。这就是row_bind()
失败的原因,因为它仔细检查列的类型是否匹配:
bind_rows(saveDat, .id = "STUSAB")
Error: Can't combine `AL$alt_acy_va` <character> and `IL$alt_acy_va` <double>.
do.call(rbind, saveDat)
不那么严格,它绑定data.frames而不发出任何警告。