【发布时间】:2020-01-17 20:53:23
【问题描述】:
我对构建函数和循环非常陌生。我已经查看了与我的问题类似的先前问题,但我似乎无法找到我的问题的解决方案。我的目标是从这样的网页中提取气候数据:
我将使用这些数据来计算作物生长模型的生长期天数。我已经成功地使用 for 循环提取数据。
uticaNE <- "https://mesonet.agron.iastate.edu/cgi-bin/request/coop.py?network=NECLIMATE&stations=NE8745&year1=2020&month1=1&day1=1&year2=2020&month2=12&day2=31&vars%5B%5D=gdd_50_86&model=apsim&what=view&delim=comma&gis=no&scenario_year=2019"
friendNE <- "https://mesonet.agron.iastate.edu/cgi-bin/request/coop.py?network=NECLIMATE&stations=NE3065&year1=2020&month1=1&day1=1&year2=2020&month2=12&day2=31&vars%5B%5D=gdd_50_86&model=apsim&what=view&delim=comma&gis=no&scenario_year=2019"
location.urls <- c(uticaNE, friendNE)
location.meso.files <- c("uticaNe.txt", "friendNE.txt")
for(i in seq_along(location.urls)){
download.file(location.urls[i], location.meso.files[i], method="libcurl")
}
我每天将有大约 20 个位置提取数据。我想要做的是将计算华氏温度、GDD 等的任务应用于每个文件并分别保存每个文件的输出。
这是我目前拥有的以下代码。
files <- list.files(pattern="*.txt", full.names=TRUE, recursive=FALSE)
func <- for (i in 1:length(files)){
df <- read.table(files[i], skip=10, stringsAsFactors =
FALSE)
colnames(df) <- c("year", "day", "solrad", "maxC",
"minC", "precipmm")
df$year <- as.f(df$year)
df$day <- as.factor(df$day)
df$maxF <- (df$maxC * (9/5) + 32)
df$minF <- (df$minC * (9/5) + 32)
df$GDD <- (((df$maxF + df$minF)/2)-50)
df$GDD[df$GDD <= 0] <- 0
df$GDD.cumulateive <- cumsum(df$GDD)
df$precipmm.cumulative <- cumsum(df$precipmm)
return(df)
write.table(df, path="./output", quote=FALSE,
row.names=FALSE, col.names=TRUE)
}
data <- apply(files, func)
任何帮助将不胜感激。
-ML
【问题讨论】:
-
抱歉,我忘记添加错误了。
Error in get(as.character(FUN), mode = "function", envir = envir) : object 'func' of mode 'function' was not found -
您不能分配 for 循环 - 您需要
func <- function(<arguments>) {<body>}。我建议该函数将单个文件名作为唯一参数,然后在循环中调用该函数,而不是在函数内部有一个循环。您可能也想更改输出路径——添加文件扩展名会很好,但最重要的是使其更改,而不是每次都覆盖同一个文件时间。我还建议使用lapply,而不是apply。apply用于矩阵。 -
欢迎来到 SO,梅森。扩展@Gregor-reinstateMonica 的评论,还可以在
lapply()中使用匿名函数,如下面我的回答所示。