r语言 - 如果缺少TRUE/FALSE需要的值,我如何跳到for循环中的下一个站点?



我正在尝试使用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而不发出任何警告。

最新更新